Express中jQuery Ajax提交数据req.body为空,为何仍需body-parser?
问题原因解析
你遇到的核心问题是请求体的Content-Type与你使用的解析中间件不匹配,和Express是否内置body-parser无关,具体拆解如下:
关于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内置的方法就行。
你的Ajax请求的Content-Type
当你用jQuery的$.ajax直接传data: {key: key}时,jQuery会默认把数据编码成application/x-www-form-urlencoded格式(类似URL查询参数的形式:key=xxx),并自动设置请求头的Content-Type为这个值。为什么
express.json()没用express.json()只会处理Content-Type为application/json的请求体,而你的请求是x-www-form-urlencoded格式,所以中间件不会解析,req.body自然是空对象。为什么
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
相关产品推荐
相关产品推荐

