Express POST请求返回空body,使用body-parser遇语法错误求助
解决Express中body-parser解析POST请求为空或报错的问题
嘿,我来帮你搞定这个POST请求解析的问题!你遇到的情况其实是请求Content-Type不匹配和请求体格式问题共同导致的,咱们一步步来解决:
问题原因分析
指定
type: 'application/*+json'时输出{}:
你设置的这个type规则只匹配application/xxx+json这种带后缀的JSON媒体类型(比如application/vnd.api+json),但大多数前端发送JSON请求时用的是标准的application/json,这个类型不在匹配范围内,所以body-parser根本没解析请求体,自然req.body是空对象。不指定type时出现Syntax Error:
这说明你的请求头里可能标记了Content-Type: application/json,但请求体本身不是合法的JSON格式(比如有语法错误、用了FormData格式而非JSON字符串),导致body-parser解析失败抛出错误。
解决方案步骤
1. 先确认前端请求的正确性
首先要保证前端发送请求时满足两个条件:
- 请求头里必须包含
Content-Type: application/json - 请求体是合法的JSON字符串,比如:
注意不能用FormData、URL编码格式,必须是纯JSON字符串。{"text": "这是一条测试消息"}
2. 修正body-parser的配置
把自定义的type选项去掉,用默认的bodyParser.json()即可,它会自动解析标准application/json类型的请求:
修正后的完整代码
var app = require('express')(); var bodyParser = require('body-parser'); var port = 1200; // 注意:这里要定义messages变量,不然GET接口会报错 var messages = []; console.log('Server is up at ' + port); // 用默认配置解析application/json类型的请求 app.use(bodyParser.json()); app.use(function (req, res, next) { console.log('app.use entered...'); res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); app.get('/msgboard', function(req, res) { console.log('app.get entered...'); res.json(messages); }); app.post('/message', function (req, res) { console.log(req.body); // 可以把收到的消息存到messages数组里 messages.push(req.body); res.sendStatus(200); }); app.listen(port);
3. 如果确实需要自定义媒体类型
如果你因为某些原因必须处理application/*+json这类非标准JSON类型,那可以同时支持标准JSON和自定义类型,比如:
app.use(bodyParser.json({ type: ['application/json', 'application/*+json'] }));
这样两种类型的请求都会被正确解析。
额外提示
测试POST请求时,可以用Postman或者curl命令来验证:
curl -X POST -H "Content-Type: application/json" -d '{"text":"Hello World"}' http://localhost:1200/message
执行后看控制台是否输出正确的请求体内容。
内容的提问来源于stack exchange,提问作者Dominik Domanski
相关产品推荐
相关产品推荐

