Express中间件按顺序添加却只执行第一个怎么办?
在Express路由里按顺序添加了两个中间件,第一个是验证token,第二个是记录日志。但发现第二个中间件里的日志根本没有输出,调试时发现程序直接跳过了第二个中间件。已经确认路由路径正确,中间件添加顺序也没问题,这是为什么呢?
尝试过在第一个中间件末尾加了next(),但好像没起作用。下面是相关代码:
app.get('/data', checkToken, logRequest);
function checkToken(req, res, next) {
console.log('checking token...'); // 这个正常输出
// 验证逻辑省略
next(); // 这里确实调用了next
}
function logRequest(req, res) {
console.log('logging request'); // 这个没输出
next(); // 已经在res.end前加了
}
logRequest中间件里。官方文档里明确提到,Express 的中间件函数签名应该是function(req, res, next),但你的logRequest只接收了两个参数req和res,少了next参数。虽然你在代码里调用了
next(),但由于函数定义本身没声明next参数,实际上这里会报错或者直接跳过。你可以试着把logRequest改成这样:另外提醒一下,调试这种问题时可以加个全局错误处理中间件捕获异常,比如:
顺便吐槽一句,我以前也被这种低级问题坑过,写代码的时候总觉得参数不重要,结果调试了半天才发现是函数签名不对。规范真的很重要啊,尤其是 Express 这种重度依赖中间件的框架。
总结一下,核心问题就是
logRequest没有正确声明next参数,加上后就能正常执行了。