koa 核心拓展——中间件机制
Posted 阿阿阿阿阿阿杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了koa 核心拓展——中间件机制相关的知识,希望对你有一定的参考价值。
源码分析
第一行,这句话的意思是检查参数是否是数组,如果不是,抛错(保证传进来的必须是一个中间件数组)。
2,3,4 遍历检查该参数的元素是否是 function,若有,抛错。
这个函数 return 的是 dispatch 函数执行返回的对象, dispatch 后面会发现是一个递归函数,根据 i 动态执行,return 的值有三种情况:
Promise.reject(err)
Promise.resolve()
Promise.resolve(fn())
dispatch
2.当前中间件和上次或上次以前的中间件是同一值,表示已经调用过了(这里是组装,最后面会讲到),通常出现这种情况是因为注册了多次或传进来的中间件数组有重复。
第二行:index = i,更改 index,备下一次迭代做检查,是为上一行服务的。
第三行:取出索引为 i 的中间件,下面的 fn 均是。
第四行:检查是否是最后一个中间件的下一个元素,是,把 fn 替换 为 next。
第五行:实际上这行是检查第四行,如果没有传 next,说明没有要初始化的中间件了,返回 Promise.resolve()。
第六行:跳过。
第七行:精华在这里!品,你细品…
context,把 context 传递到 fn 中。
dispatch.bind:bind,返回的是一个懒加载函数,第一个是引用指向,第二个就是把 下一个索引传进去,作用实际上就是把下一个中间件传递。
如果一次一次执行,就会发现 最初的是 [fn1,fn2,fn3,fn4,fn5],最后变为…这里还是写伪代码比较直观
function finalFn(ctx) {
return Promise.resolve(f1(ctx,
Promise.resolve(f2(ctx,
Promise.resolve(f3(ctx,
Promise.resolve(f4(ctx,
Promise.resolve(f5(ctx,
Promise.resolve()
))
))
))
))
))
}
上面整理的结果,也就是大家常说的 洋葱模型 ,因为他真的很像洋葱,一层一层拨开(心里的BGM有点刹不住了…)
下面上两张图:
示例
const koa = require( "koa");
const parseBody = require( "koa-body");
const app = new koa();
app.use(parseBody());
const mergeParams = async (ctx, next) => {
ctx.params = {};
Object.assign(ctx.params, ctx.query, ctx.request.query);
await next();
}
app.use(mergeParams);
app.use( ctx => {
console.log(ctx.params);
ctx.body = "success";
});
app.listen( 3000);
node serve.js
在浏览器,访问
结语
以上是关于koa 核心拓展——中间件机制的主要内容,如果未能解决你的问题,请参考以下文章