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

Express路由POST请求异常:JSON语法错误及数据获取求助

解决Express POST请求req.body为空及添加bodyParser后400错误的问题

我之前也踩过完全一样的坑!咱们一步步拆解问题,找到解决方案:

一、先搞清楚为什么一开始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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:14:40