目前为止我们已经成功实现了上下文context对象、请求request对象和响应response对象模块,还差一个最重要的模块,就是koa的中间件模块,koa的中间件机制是一个剥洋葱式的模型,多个中间件通过use放进一个数组队列然后从外层开始执行,遇到next后进入队列中的下一个中间件,所有中间件执行完后开始回帧,执行队列中之前中间件中未执行的代码部分,这就是剥洋葱模型,koa的中间件机制。
koa的剥洋葱模型
在koa1中使用的是generator+co.js去实现的,koa2则使用了async/await+Promise去实现的,接下来我们基于async/await+Promise去实现koa2中的中间件机制。首先,假设当koa的中间件机制已经做好了,那么它是能成功运行下面代码的:
letKoa=require('../src/application');
letapp=newKoa();
app.use(async(ctx,next)=>{
console.log(1);
awaitnext();
console.log(6);
});
app.use(async(ctx,next)=>{
console.log(2);
awaitnext();
console.log(5);
});
koa中间件机制和剥洋葱模型的实现
app.use(async(ctx,next)=>{
console.log(3);
ctx.body="helloworld";
console.log(4);
});
app.listen(3000,()=>{
console.log('listenningon3000');
});
总之,运行成功后会在终端输出123456,那就能验证我们的koa的剥洋葱模型是正确的。接下来我们开始实现,修改application.js文件,添加代码。