Node.js Express中POST请求返回错误数据问题求助
问题分析与解决建议
1. 「requestBody」的来源
这个字段是你自己的代码生成的:看你代码里的res.json({requestBody: req.body});这行,你主动将请求体req.body包装在了requestBody字段中,作为响应内容发送给客户端,这就是它的来源。
2. 响应中id仍为null的原因
HTTP协议规定每个请求只能对应一次完整响应。你在代码里先调用了res.json({requestBody: req.body}),这时候响应已经被发送到浏览器,后续对role.id的修改以及res.end(JSON.stringify(role))的调用都不会生效——客户端已经接收到第一次发送的响应,后续的响应输出会被Express忽略。
你看到的响应正是第一次res.json()发送的内容,当时role.id还没有被修改为1,所以显示的是原始的null。
3. 修正方案
只需要保证对请求只发送一次响应,并且在发送前完成数据修改即可。以下是两种修正后的代码示例:
示例1:直接返回修改后的role对象
app.post('/userroles', async (req, res) => { console.log("save userrole"); let role = req.body.role; console.log(JSON.stringify(role)); role.id = 1; console.log(JSON.stringify(role)); // 仅发送一次响应,返回修改后的role res.json(role); })
示例2:保留requestBody结构,先修改再发送
如果你需要保留requestBody的响应结构,就先修改req.body中的role,再发送响应:
app.post('/userroles', async (req, res) => { console.log("save userrole"); let role = req.body.role; console.log(JSON.stringify(role)); role.id = 1; console.log(JSON.stringify(role)); // 修改完成后再发送包装后的响应 res.json({requestBody: req.body}); })
注意:永远不要在一个请求处理函数中多次调用res.json()、res.end()或其他发送响应的方法,这会导致不可预期的行为,Express会自动忽略后续的响应发送尝试。
内容的提问来源于stack exchange,提问作者Thallius
相关产品推荐
相关产品推荐

