node JS 中 Koa2 中间件实现原理分析

一、koa2

  1. koa2,如下所示:
  • express 中间件是异步回调,koa2 原生支持 async/await
  • 新开发框架和系统,都开始基于 koa2,例如 egg.js
  • express 虽然未过时,但是 koa2 肯定是未来趋势
  1. asyncawait 要点:
  • await 后面可以追加 promise 对象,获取 resolve 的值
  • await 必须包裹在 async 函数里面
  • async 函数执行返回的也是一个 promise 对象
  • try-catch 截获 promisereject 的值
  1. koa2 中间件的实现内部原理,代码如下所示:
const http = require('http')

// 组合中间件
function compose(middlewareList) {
    
    
  return function (ctx) {
    
    
    function dispatch(i) {
    
    
      const fn = middlewareList[i]
      try {
    
    
        return Promise.resolve(fn(ctx, dispatch.bind(null, i + 1))) // promise 对象
      } catch (err) {
    
    
        return Promise.reject(err)
      }
    }
    return dispatch(0)
  }
}


class LikeKoa2 {
    
    
  constructor () {
    
    
    this.middlewareList = []
  }

  use (fn) {
    
    
    this.middlewareList.push(fn)
    return this
  }

  createContext (req, res) {
    
    
    const ctx = {
    
    
      req,
      res
    }
    ctx.query = req.query
    return ctx
  }

  handleRequest (ctx, fn) {
    
    
    return fn(ctx)
  }

  callback () {
    
    
    const fn = compose(this.middlewareList)

    return (req, res)  => {
    
    
      const ctx = this.createContext(req, res)
      return this.handleRequest(ctx, fn)
    }
  }

  listen (...args) {
    
    
    const server = http.createServer(this.callback())
    server.listen(...args)
  }
}

module.exports = LikeKoa2

猜你喜欢

转载自blog.csdn.net/weixin_42614080/article/details/110944334