Node.js 中间件执行顺序为什么不对?

Prog.爱书 阅读 4

我在 Express 里写了几个中间件,但发现它们的执行顺序和我写的顺序不一致,明明是先 use 的 A,再 use 的 B,结果 B 先执行了?

我试过把中间件函数写成同步的,也检查过 next() 调用没问题,但还是乱序。是不是跟路由路径有关?比如有的中间件绑定了特定路径?

顺便贴一下我项目里用到的一段全局样式,虽然可能不相关,但怕是不是前端资源加载影响了请求顺序:

body {
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto;
  background-color: #f5f5f5;
}
.loading {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}
我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
UI紫萱
UI紫萱 Lv1
确实跟路由路径有关。Express 中间件的执行顺序是按 use 的顺序没错,但如果你给中间件绑定了特定的路径,那它的执行顺序会受请求路径影响。

比如说你先用 app.use('/api', middlewareA) 再用 app.use(middlewareB),当请求 /api 路径时,middlewareB 会先执行,因为它是全局中间件。

给你个效率更高的方案:把所有中间件都统一在文件顶部声明,并且按优先级排序,不要混着写带路径和不带路径的中间件。如果真需要路径区分,建议把逻辑都放在一个中间件里处理。

顺便说一句,你贴的那段样式代码跟这个问题完全没关系,不用管前端资源加载的问题。


const express = require('express');
const app = express();

// 先注册通用中间件
app.use((req, res, next) => {
console.log('Middleware A');
next();
});

// 再注册带有路径的中间件
app.use('/api', (req, res, next) => {
console.log('Middleware B');
next();
});


这样就能保证执行顺序了。别忘了在开发环境多打印日志调试,省得搞混了又来找问题。
点赞
2026-03-28 08:07