源码:
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()则在当前中间件函数执行完的时候执行下一个中间件
本文详细介绍了Node.js中中间件的工作原理,通过示例代码展示了如何使用`app.use()`来注册中间件。在代码中,`dispatch`函数通过递归调用来执行中间件链,`next()`函数用于跳转到下一个中间件。当`next()`未被调用时,中间件会同步执行。关键词包括Promise、中间件、递归、上下文、异步操作。
1417

被折叠的 条评论
为什么被折叠?



