koa2中间件原理

源码:koa-compose.js

function compose (middleware) {
  if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')
  for (const fn of middleware) {
    if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')
  }

  /**
   * @param {Object} context
   * @return {Promise}
   * @api public
   */

  return function (context, next) {
    // last called middleware #
    let index = -1
    return dispatch(0)
    function dispatch (i) {
      if (i <= index) return Promise.reject(new Error('next() called multiple times'))
      index = i
      let fn = middleware[i]
      if (i === middleware.length) fn = next
      if (!fn) return Promise.resolve()
      try {
        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
      } catch (err) {
        return Promise.reject(err)
      }
    }
  }
}

koa2的中间件流向是先按顺序执行next以前内容,然后对next以后内容进行回溯。
middleware是使用use添加的中间件数组,
核心代码只有一句Promise.resolve(fn(context, dispatch.bind(null, i + 1))); dispatch.bind(null, i + 1)替换掉了next,也就是说将所有的中间件以next占位符进行替换,类似于react setState的事务抽取机制

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本节将结合例子和源码对koa2的中间件机制做一介绍。 什么是中间件? 中间件的本质就是一种在特定场景下使用的函数,...
    空无一码阅读 1,460评论 0 2
  • 最近需要单独使用到koa-compose这个模块,虽然使用koa的时候大致知道中间件的执行流程,但是没仔细研究过源...
    若邪Y阅读 1,134评论 0 0
  • 我们知道,Koa 中间件是以级联代码(Cascading) 的方式来执行的。类似于回形针的方式,可参照下面这张图:...
    中间件阅读 1,593评论 0 4
  • 源码阅读 上次一篇说到callback中使用了compose,现在看看里面都做了什么。 中间件机制(洋葱模型):它...
    ceido阅读 678评论 0 2
  • 看到前面泽江@我,是关于杨过与小龙女的故事,写了这段回复。 关于杨过和小龙女的故事,如果我们就事论事地去解读和思考...
    放心之语阅读 2,442评论 0 0