Express 4.17.1中request.body返回空对象 Postman正常前端调用失败
问题排查方案
1. 调整Express中间件与路由的注册顺序
Express的中间件、路由按照代码声明的先后顺序执行,必须保证app.use(express.json())写在所有接口路由的前面。如果你的/test接口路由注册在JSON解析中间件之前,该路由不会触发解析逻辑,req.body自然返回空对象。
错误写法示例
app.post('/test', (req, res) => { console.log(req.body) // 输出空对象 }) app.use(express.json()) app.use(cors())
正确写法示例
app.use(express.json()) app.use(cors()) // 所有路由必须放在内置中间件声明之后 app.post('/test', (req, res) => { console.log(req.body) // 可正常获取解析后的JSON数据 })
2. 修正请求头拼写规范
前端fetch配置中的请求头Content-type写法不规范,标准写法为Content-Type(T为大写),部分严格的服务端环境无法识别小写的请求头,导致无法触发JSON解析逻辑:
fetch('http://localhost:9000/test', { method: 'POST', headers: { 'Content-Type': 'application/json' // 修正为标准写法 }, body: JSON.stringify(myData) })
3. 处理跨域预检请求
跨域POST请求会先发送OPTIONS类型的预检请求,若未对该类请求做放行处理,会导致请求体解析异常。可以在所有路由前添加预检请求处理逻辑:
app.use(express.json()) app.use(cors()) // 放行所有OPTIONS预检请求 app.options('*', cors())
4. 排查前置中间件是否提前消费请求流
如果项目中存在自定义中间件、鉴权/日志类第三方中间件在express.json()之前执行,且中间件内部提前消费了请求的可读流,也会导致后续JSON解析逻辑无法拿到请求体数据。可以临时注释掉express.json()之前的其他中间件逐一排查。
内容的提问来源于stack exchange,提问作者Dayana Scott
相关产品推荐
相关产品推荐

