收集
new 一个koa实例后,调用use接口会将传入的中间件函数push到middleware属性数组中做收集
1 | application.js |
根据koa框架版本不同,需要将使用generator函数写的中间件转化成基于promise的函数形式
1 | const convert = require('koa-convert'); |
整合
调用listen函数开启服务时,整合所有中间件为一个大函数,大函数中进行剥洋葱流程
在收到请求时调用
1 | application.js |
整合中间件 ,返回大函数,大函数中有剥洋葱模型
1 | function compose (middleware) { |
剥洋葱流程
1 | let index = -1 |
利用await暂停当前中间件执行,调用next开始执行下一个中间件
如果下一个中间件没有调next,且不是最后一个中间件,
即不会再调用dispatch执行下下一个中间件,则后续中间件都不会被执行到
如果下一个中间件是最后一个中间件,且在其中调用了next,则不会走到这个流程,
在上面的流程中就return
如果下一个中间件是最后一个中间件,则执行完return Promise.resolve
上一个中间件await 拿到结果后继续执行await后面的代码
执行完await后面代码后,上上一个中间件await 拿到结果,继续执行当前中间件await后代码
依次类推,直到第一个中间件await后代码执行完毕,整个中间件流程,
即剥洋葱流程先内层后外层执行流程完毕
返回promise 接着then处理响应或者中间有错误捕获错误
fnMiddleware(ctx).then(handleResponse).catch(onerror)