Express Router GET请求正常但POST请求返回404问题
POST接口返回404但GET接口正常的原因及解决方法
问题场景
现有Express路由代码如下,其中/job-notify POST接口返回404未找到,但/job-appl-monitor GET接口可正常响应:
基础路由配置
const express = require('express'); const app = express(); const router = express.Router(); const bodyParser = require('body-parser'); // Parsers for POST data router.use(bodyParser.json()); router.use(bodyParser.urlencoded({ extended: true }));
异常的POST接口
router.post('/job-notify', (req, res, next) => { res.send("NNN") console.log("NNN") next() });
正常的GET接口
router.get('/job-appl-monitor', (req, res, next) => { console.log("MMM") res.send("MMM") next() }); module.exports = router;
可能原因
- 路由挂载前缀不匹配:主应用挂载路由时可能添加了前缀(如
app.use('/api', router)),但请求时未携带该前缀,导致路径不匹配。 - 请求URL拼写错误:POST请求的URL可能存在大小写、字符拼写错误(如写成
/job_notify或/Job-Notify),与路由定义的路径不一致。 - 中间件拦截:存在其他中间件(如权限校验、静态文件服务)在该路由之前拦截了POST请求,导致请求无法到达目标路由。
- 请求方法错误:实际发送的请求并非POST方法(如误发GET请求到
/job-notify),而该路径未定义GET路由,因此返回404。 - 路由顺序问题:若存在通配符路由(如
router.all('*', ...))定义在POST路由之前,可能提前匹配并阻断请求。
解决方法
- 核对路由挂载前缀:检查主应用中挂载路由的代码,若使用了前缀(如
app.use('/v1', router)),则POST请求的完整路径应为/v1/job-notify,确保请求路径包含正确前缀。 - 校验请求URL:严格对比请求URL与路由定义的
/job-notify,确保大小写、字符完全一致。 - 调整中间件顺序:确保路由中间件在静态文件中间件之后、错误处理中间件之前挂载,避免被其他中间件提前拦截。
- 确认请求方法:使用curl或API测试工具验证请求方法为POST,例如执行:
curl -X POST http://localhost:3000/job-notify - 调整路由顺序:将通配符路由移至所有具体路由的末尾,避免提前匹配覆盖目标路由。
内容的提问来源于stack exchange,提问作者فوزي الصويمل Fawzi Alswaimil
相关产品推荐
相关产品推荐

