前端fetch()发送PUT请求后端Express获取req.body为undefined如何解决
问题成因
- 最核心的原因是Express默认不会自动解析请求体内容,你没有在服务端注册JSON格式请求体的解析中间件,前端传的
Content-Type: application/json格式的请求数据没有被解析挂载到req.body对象上,所以读取的时候为undefined。 - 少数场景下也可能是中间件注册顺序错误,解析请求体的中间件在路由挂载之后才注册,请求进入路由处理逻辑时还没有经过解析处理。
解决方案
步骤1:注册JSON解析中间件
Express 4.16.0及以上版本已经内置了JSON解析能力,直接在路由挂载代码前添加以下配置即可:
// 要放在 app.use('/articles', routes.articles) 之前执行 app.use(express.json());
如果你的Express版本低于4.16.0,需要先安装body-parser依赖,再注册对应的解析中间件:
npm install body-parser
然后在服务端入口文件添加配置:
const bodyParser = require('body-parser'); // 放在路由挂载之前 app.use(bodyParser.json());
额外问题修复
你当前的服务端路由代码还有一个逻辑错误:res.end()的调用时机提前,会导致数据库更新操作还没完成就给客户端返回响应,而且res.status(500).send只能接收一个参数,错误信息需要合并为单个参数传递,调整后的路由代码参考:
router.route('/put/:_id').put((req, res) => { const _id = req.params._id; const obj = req.body; debug && console.log('DEBUG: route: /articles/put : req.body', req.body); DBM.updateArticle(_id, obj) .then(() => { res.status(200).end(); }) .catch((err)=>{ res.status(500).send(`DEBUG: database internal error: ${err}`); }); });
内容的提问来源于stack exchange,提问作者user12102894
相关产品推荐
相关产品推荐

