Express中间件按顺序添加却只执行第一个怎么办?

UX-俊宇 阅读 27

在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前加了
}
我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
开发者鹏宇
问题出在你的 logRequest 中间件里。官方文档里明确提到,Express 的中间件函数签名应该是 function(req, res, next),但你的 logRequest 只接收了两个参数 reqres,少了 next 参数。

虽然你在代码里调用了 next(),但由于函数定义本身没声明 next 参数,实际上这里会报错或者直接跳过。你可以试着把 logRequest 改成这样:

function logRequest(req, res, next) {
console.log('logging request'); // 确保这行能输出
next(); // 调用 next 继续执行后续逻辑
}


另外提醒一下,调试这种问题时可以加个全局错误处理中间件捕获异常,比如:

app.use((err, req, res, next) => {
console.error('Error caught:', err.message);
res.status(500).send('Something broke!');
});


顺便吐槽一句,我以前也被这种低级问题坑过,写代码的时候总觉得参数不重要,结果调试了半天才发现是函数签名不对。规范真的很重要啊,尤其是 Express 这种重度依赖中间件的框架。

总结一下,核心问题就是 logRequest 没有正确声明 next 参数,加上后就能正常执行了。
点赞
2026-02-19 15:06