Express中同路由app.use致中间件重复调用的问题及解决方法
关于express.urlencoded中间件重复调用的问题解答
1. 针对/login2路由,express.urlencoded会被调用两次吗?
是的,会被调用两次。原因如下:
- 第一行的
app.use(express.urlencoded({ extended: false }))是全局中间件,会匹配所有进入服务器的请求,包括发往/login2的请求,这是第一次调用。 - 第二行的
app.use("/login2", [express.urlencoded({ extended: false }), moduleValidation])是路由级中间件,当请求匹配/login2路径时,会依次执行数组内的中间件,这里的express.urlencoded就是第二次调用。
重复调用虽不会直接引发程序报错,但属于冗余操作,会额外消耗服务器资源,建议避免。
2. 如何避免重复调用?
有两种实用的解决方案:
方案一:保留全局中间件,移除路由内的重复配置
既然全局中间件已经能处理所有请求的urlencoded格式解析,/login2路由无需再单独配置一次,修改后的代码如下:
app.use(express.urlencoded({ extended: false })); app.use("/login2", moduleValidation);
方案二:移除全局中间件,仅在需要的路由配置
如果服务器只有部分路由需要解析urlencoded格式的请求体,可以去掉全局中间件配置,只在特定路由(比如/login2)中添加该中间件,代码如下:
app.use("/login2", [express.urlencoded({ extended: false }), moduleValidation]);
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

