You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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修改请求方法已经没有意义了。


修复步骤

  1. 调整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);
  1. 调整路由定义,保留delete方法即可,不需要用post:
router.route('/posts/delete/:id')
    .delete(adminController.deletePost);

调整完成后,携带_method=DELETE的表单提交请求就可以正常被router.delete路由匹配到,不需要强制使用post方法处理。


内容的提问来源于stack exchange,提问作者casperf1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:06:01