写在前面
我们已经知道koa2中间件是基于async/await
实现的,其执行过程是通过next
来驱动的,于是,koa2就有了一个特殊的执行顺序,我们为这种执行顺序设定了一个模型叫--洋葱模型。
什么是洋葱模型
现在假想,你手里有一支牙签,横向穿过一个洋葱,是不是会层层穿透?从第一层进去、到第二层、第三次...然后到中间层后,再层层穿透的出,从第三层出、第二层、第一层...。其实我们的koa2中间件执行顺序也是这样的。抛开业务代码,用koa2官网的一个例子做实验
const Koa = require('koa');
const app = new Koa();
// logger
app.use(async (ctx, next) => {
console.log('第一层洋葱 - 开始')
await next();
const rt = ctx.response.get('X-Response-Time');
console.log(`${ctx.method} ${ctx.url} - ${rt}`);
console.log('第一层洋葱 - 结束')
});
// x-response-time
app.use(async (ctx, next) => {
console.log('第二层洋葱 - 开始')
const start = Date.now();
await next();
const ms = Date.now() - start;
ctx.set('X-Response-Time', `${ms}ms`);
console.log('第二层洋葱 - 结束')
});
// response
app.use(async ctx => {
console.log('第三层洋葱 - 开始')
ctx.body = 'Hello World';
console.log('第三层洋葱 - 结束')
});
app.listen(8000);
我们执行一下上面代码。会发现打印结果是
第一层洋葱 - 开始
第二层洋葱 - 开始
第三层洋葱 - 开始
第三层洋葱 - 结束
第二层洋葱 - 结束
第一层洋葱 - 结束
这就是洋葱模型,一个执行顺序。
这里只是我在学习过程中的一个总结,详细的洋葱模型这里推荐一片https://segmentfault.com/a/1190000013981513
写在最后
洋葱模型是koa2很重要的一个中间件执行顺序模型,理解他对理解koa2的中间件机制有很大帮助
网友评论