Express路由POST请求异常:JSON语法错误及数据获取求助
我之前也踩过完全一样的坑!咱们一步步拆解问题,找到解决方案:
一、先搞清楚为什么一开始req.body是空
在Express里,框架默认不会自动解析请求体内容,所以如果没添加任何解析中间件,req.body自然就是空对象{}。这一步你已经意识到要加解析中间件,只是后续出现了新问题,咱们接着排查。
二、添加bodyParser后出现400 Bad Request的常见原因及解决办法
1. 你可能用了过时的bodyParser包,或者没匹配请求的Content-Type
从Express 4.16.0开始,官方已经把body-parser的核心功能内置到Express里了,不用再单独安装body-parser包!直接用Express自带的express.json()和express.urlencoded()就可以,配置更简单也更稳定。
修改你的App.js:
const express = require('express'); const app = express(); const enqueteRoutes = require('./routes/enquete'); // 解析JSON格式的请求体 app.use(express.json()); // 解析表单格式的请求体(如x-www-form-urlencoded) app.use(express.urlencoded({ extended: true })); // 挂载路由 app.use('/enquete', enqueteRoutes); app.listen(3000, () => { console.log('Server running on port 3000'); });
2. 检查你的Ajax请求的Content-Type是否和解析中间件匹配
如果Ajax发送的是JSON数据,必须设置请求头Content-Type: application/json,否则express.json()会无法解析请求体,直接返回400错误。举个jQuery Ajax的例子:
$.ajax({ url: 'http://localhost:3000/enquete/test/', method: 'POST', contentType: 'application/json', // 这个一定要加! data: JSON.stringify({ username: 'test', content: 'hello' }), // 要转成JSON字符串 success: function(res) { console.log(res); }, error: function(err) { console.error(err); } });
如果是发送表单数据,确保用了express.urlencoded({ extended: true }),jQuery默认的contentType就是application/x-www-form-urlencoded,所以不用手动改,但原生fetch请求要注意手动设置。
3. 检查路由定义是否和请求地址匹配
确保routes/enquete.js里的POST路由路径和请求地址一致,比如:
const express = require('express'); const router = express.Router(); router.post('/test/', (req, res) => { console.log(req.body); // 现在应该能正常拿到数据了 res.status(200).json({ message: '数据接收成功', data: req.body }); }); module.exports = router;
注意Express默认的严格路由模式下,/enquete/test/和/enquete/test是两个不同的路径,如果你的请求带末尾斜杠,路由也要对应上;嫌麻烦的话可以加app.set('strict routing', false)来忽略末尾斜杠的差异。
三、最后几个容易忽略的小细节
- 要是你坚持要用单独的
body-parser包,一定要安装最新版本,并且配置正确:const bodyParser = require('body-parser'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); - 检查请求数据的格式是否正确,比如JSON有没有语法错误(少逗号、引号不匹配),这种问题也会导致解析失败返回400。
内容的提问来源于stack exchange,提问作者Elvira

