运行成功后会在终端输出123456,那就能验证我们的koa的剥洋葱模型是正确的。接下来我们开始实现,修改application.js文件。
koa的剥洋葱模型添加如下代码:
compose(){
returnasyncctx=>{
functioncreateNext(middleware,oldNext){
returnasync()=>{
awaitmiddleware(ctx,oldNext);
}
}
letlen=this.middlewares.length;
letnext=async()=>{
returnPromise.resolve();
};
for(leti=len-1;i>=0;i--){
letcurrentMiddleware=this.middlewares[i];
next=createNext(currentMiddleware,next);
}
awaitnext();
};
}
callback(){
return(req,res)=>{
letctx=this.createContext(req,res);
letrespond=()=>this.responseBody(ctx);
letonerror=(err)=>this.onerror(err,ctx);
letfn=this.compose();
returnfn(ctx);
};
}
koa通过use函数怎么做
把所有的中间件push到一个内部数组队列this.middlewares中,剥洋葱模型能让所有的中间件依次执行,每次执行完一个中间件,遇到next()就会将控制权传递到下一个中间件,下一个中间件的next参数,剥洋葱模型的最关键代码是compose这个函数。
总之,koa中createNext函数的作用就是将上一个中间件的next当做参数传给下一个中间件,并且将上下文ctx绑定当前中间件,当中间件执行完,调用next()的时候,其实就是去执行下一个中间件。