源码:
return function (context, next) {
// last called middleware #
let index = -1
return dispatch(0)
function dispatch (i) {
if (i <= index) return Promise.reject(new Error('next() called multiple times'))
index = i
let fn = middleware[i]
if (i === middleware.length) fn = next
if (!fn) return Promise.resolve()
try {
return Promise.resolve(fn(context, dispatch.bind(null, i + 1)))
} catch (err) {
return Promise.reject(err)
}
}
}
使用:
app.use(async (ctx, next) => {
console.log(ctx.req);
await next();
console.log(ctx.res);
});
分析:
1. Promise.resolve(fn(context, dispatch.bind(null, i + 1)))
这里其实是一个递归操作,dispatch.bind(null, i + 1)是middleware下一个中间件
2. await next();
就是执行下一个middleware,没有使用 await next()则在当前中间件函数执行完的时候执行下一个中间件