测试用例如下
app.use(async (ctx,next)=>{
console.log('ctx',ctx)
console.log('next',next)
ctx.body='<a>';
await next();
ctx.body+='</a>'
})
app.use(async (ctx,next)=>{
ctx.body+='<b>';
await next();
ctx.body+='</b>'
})
app.use(async (ctx,next)=>{
ctx.body+='abc'
})
发现参数ctx变成了next。
解决:直接传ctx到compose
listen(port, callback) {
const server = http.createServer(async (req, res) => {
// 创建上下文
const ctx = this.createCtx(req, res);
const fn = this.compose(ctx,this.middleweres);
await fn();
res.end(ctx.body);
});
server.listen(port, (err) => {
callback(err)
})
}
// 洋葱模型直接传参
compose(ctx,middleweres) {
return function () {
// 如果有下一个,返回下一个带参数的promise,否则结束。
function dispatch(i) {
let fn = middleweres[i];
if (!fn) {
return Promise.resolve();
}
return Promise.resolve(fn(ctx,
function next() {
return dispatch(i + 1);
}
))
}
return dispatch(0);
}
}