Node.js Express用method-override时为何带_method=DELETE的请求仅router.post生效
问题根因
你的method-override中间件没有生效,核心原因是中间件和路由的加载顺序错误。
method-override的作用是修改请求的req.method属性,这个修改必须在路由匹配执行之前完成才能生效。如果你把路由挂载的代码(比如app.use('/admin', adminRouter))写在了app.use(methodOverride('_method'))的前面,请求过来会先匹配路由,此时req.method还是原生的POST,所以只有router.post能命中,后续再执行method-override修改请求方法已经没有意义了。
修复步骤
- 调整
app.js里的中间件和路由加载顺序,确保method-override在所有路由挂载之前加载:
const methodOverride = require ('method-override'); const express = require('express'); const app = express(); // 先加载method-override中间件 app.use(methodOverride('_method')); // 再挂载路由,顺序不能反过来 const adminRouter = require('./routes/admin'); app.use('/admin', adminRouter);
- 调整路由定义,保留
delete方法即可,不需要用post:
router.route('/posts/delete/:id') .delete(adminController.deletePost);
调整完成后,携带_method=DELETE的表单提交请求就可以正常被router.delete路由匹配到,不需要强制使用post方法处理。
内容的提问来源于stack exchange,提问作者casperf1
相关产品推荐
相关产品推荐

