NodeJS服务GET接口正常 POST接口返回404 Not Found求助
Express POST接口返回404排查方案
GET路由/greetme可正常响应,说明Express服务运行、基础路由挂载链路无异常,POST路由返回Not Found按以下优先级排查:
- 测试方法错误(最高发原因)
直接在浏览器地址栏输入URL发起的默认是GET请求,完全不会匹配router.post()定义的接口规则,必然返回404。浏览器地址栏原生不支持自定义请求方法,测试POST接口请使用curl命令、接口调试工具发起POST类型请求,不要直接在地址栏访问。
服务器侧快速测试命令参考:# 测试/signin接口,替换成你实际的服务端口、请求参数 curl -X POST http://127.0.0.1:3000/signin \ -H "Content-Type: application/json" \ -d '{"username":"test","password":"123456"}' - 路由注册逻辑错误
打开routes/index.js逐一核对:- 是否正确引入
auth_onboardingController.js文件,漏引控制器会导致对应路由无处理函数 /signin、/onboarding两个路由是否明确用router.post()注册,不要误写为router.get()- 核对路由挂载前缀:如果
app.js中写的是app.use('/api', router),那实际接口路径为/api/signin、/api/onboarding,直接访问根路径下的地址会404
路由部分正确写法参考:
同时核对// routes/index.js const express = require('express') const router = express.Router() // 引入两个控制器 const greetme = require('../controller/greetme') const authController = require('../controller/auth_onboardingController') // 注册已正常的GET路由 router.get('/greetme', greetme) // 注册POST路由,重点核对这部分 router.post('/signin', authController.signin) router.post('/onboarding', authController.onboarding) module.exports = routerapp.js中的路由挂载代码:// app.js 必须正确引入并挂载路由 const indexRouter = require('./routes/index') // 注意这里的挂载路径就是接口的统一前缀 app.use('/', indexRouter) - 是否正确引入
- 控制器导出错误
打开controller/auth_onboardingController.js核对,是否正确导出signin、onboarding两个处理方法。如果方法未导出,服务启动阶段不会抛出编译错误,但路由实际无法匹配到处理函数,会返回404。
正确导出示例:// controller/auth_onboardingController.js const signin = async (req, res) => { // 登录业务逻辑 res.send({code:0, msg:'login success'}) } const onboarding = async (req, res) => { // 入驻/注册业务逻辑 res.send({code:0, msg:'onboarding success'}) } // 必须显式导出对应方法 module.exports = { signin, onboarding } - 反向代理规则错误
如果VPS上部署了Nginx等反向代理服务,检查代理规则是否对请求方法做了限制,比如存在仅放行GET请求、POST请求被重写到其他不存在路径的配置,会导致POST请求404。
内容的提问来源于stack exchange,提问作者OlammieConcept
相关产品推荐
相关产品推荐

