ExpressJS中next()参数在抽象层下的工作原理及执行机制
Express 中
next() 的工作原理与底层实现 核心作用
在Express的中间件机制里,next() 就是中间件之间的“接力棒”——它告诉Express:当前中间件的逻辑执行完毕,请调用下一个匹配的中间件或路由处理函数。
示例代码的执行流程
先看你给出的示例代码:
app.use((req, res, next) => { console.log('Time:', Date.now()) next() }); app.use((req, res, next) => { console.log('Time2:', Date.now()) next() });
执行过程清晰直白:
- 请求进入应用后,Express会严格按照中间件注册的先后顺序执行。第一个
app.use注册的中间件先运行,打印出带当前时间的Time:日志。 - 当代码执行到
next()时,Express会暂停当前中间件的执行,转而触发下一个通过app.use注册的中间件,于是输出Time2:的时间日志。 - 如果第二个中间件的
next()之后没有其他匹配的中间件或路由,Express会自动完成请求收尾,比如返回404(如果没有自定义404处理逻辑的话)。
底层实现逻辑
Express内部会把所有注册的中间件、路由处理函数维护成一个有序数组:
- 应用启动时,你通过
app.use、app.get等方式添加的所有处理函数,都会按注册顺序存入这个数组。 - 请求到来时,Express会生成一个“迭代指针”,初始指向数组的第一个元素。
- 每次调用
next(),本质就是让这个指针向后移动一位,然后执行数组中当前指针指向的函数:- 内部会先检查数组是否遍历完毕,如果还有未执行的函数,就把
req、res和更新后的next(这个新next会指向更靠后的数组元素)作为参数传入目标函数; - 如果数组已经遍历完成,Express就默认结束请求响应流程。
- 内部会先检查数组是否遍历完毕,如果还有未执行的函数,就把
额外补充两个特殊用法:
- 调用
next('route'):会跳过当前路由下剩余的中间件,直接匹配下一个路由; - 调用
next(error):会直接跳转到错误处理中间件(即带有err, req, res, next四个参数的中间件)。
内容的提问来源于stack exchange,提问作者jinhiro
相关产品推荐
相关产品推荐

