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

Express中jQuery Ajax提交数据req.body为空,为何仍需body-parser?

问题原因解析

你遇到的核心问题是请求体的Content-Type与你使用的解析中间件不匹配,和Express是否内置body-parser无关,具体拆解如下:

  1. 关于Express内置body-parser的事实
    新版Express确实已经内置了body-parser的核心功能:

    • express.json() 等价于 bodyParser.json(),负责解析Content-Type: application/json格式的请求体
    • express.urlencoded({ extended: true }) 等价于 bodyParser.urlencoded({ extended: true }),负责解析Content-Type: application/x-www-form-urlencoded格式的请求体
      所以你完全不需要单独安装和引入body-parser包,用Express内置的方法就行。
  2. 你的Ajax请求的Content-Type
    当你用jQuery的$.ajax直接传data: {key: key}时,jQuery会默认把数据编码成application/x-www-form-urlencoded格式(类似URL查询参数的形式:key=xxx),并自动设置请求头的Content-Type为这个值。

  3. 为什么express.json()没用
    express.json()只会处理Content-Type为application/json的请求体,而你的请求是x-www-form-urlencoded格式,所以中间件不会解析,req.body自然是空对象。

  4. 为什么bodyParser.urlencoded()能解决问题
    这个中间件就是专门处理x-www-form-urlencoded格式请求体的,匹配上你的请求格式,所以能正确解析出req.body的数据。

优化方案

如果你不想用x-www-form-urlencoded,想让express.json()生效,可以修改Ajax请求,明确指定发送JSON格式数据:

$.ajax({
    url: 'http://localhost:8000/api/v1/endpoint',
    method: 'POST',
    contentType: 'application/json', // 明确指定Content-Type
    data: JSON.stringify({key: key}) // 把对象转为JSON字符串
})
.done(function(data) {
    console.log(data)
})
.fail(function(data) {
    console.log(data);
})

这样只需要保留app.use(express.json())就能正常解析req.body了。

内容的提问来源于stack exchange,提问作者user8463989

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:12:15