Node.js Express中PUT请求req.body为空对象{}问题排查
问题根因
更新帖子的PUT接口未配置multipart/form-data格式请求的解析中间件,导致后端无法解析前端传的FormData请求体:
- 前端调用更新接口时使用
FormData对象传参,该数据格式为multipart/form-data,Express内置的express.json()、express.urlencoded()以及你引入的body-parser相关解析方法,均不支持解析这种格式的请求体,只有multer这类专门处理multipart格式的中间件,才能解析出FormData里存储的字段。 - 对照你的路由配置:创建帖子的POST路由挂载了multer中间件(
router.post("/", auth, multer, postCtrl.createPost)),但更新帖子的PUT路由仅挂载了auth校验中间件,没有配置multer,请求到达控制器时FormData字段完全没被解析,req.body自然是空对象。 - 额外注意:你当前控制器里的
console.log写在异步数据库操作之后,虽然不影响功能,但调试时建议挪到控制器最开头,避免异步时序干扰日志判断。
修复方案
方案1(适配现有前端FormData写法)
修改帖子路由配置,给PUT更新接口加上multer中间件,和POST创建路由保持一致:
// 原错误写法 // router.put("/:id", auth, postCtrl.updatePost); // 修改后 router.put("/:id", auth, multer, postCtrl.updatePost);
可选优化:调整控制器日志位置,方便后续调试:
exports.updatePost = (req, res, next) => { // 日志挪到接口入口处打印 console.log(req.body) console.log(req.params.id) Post.update( { message: req.body.message, }, { where: { id: req.params.id } } ) .then(() => res.status(200).json({ message: "post modifié" })) .catch((error) => res.status(500).json({ error })); };
方案2(纯文本更新场景可选,无需依赖multer)
如果更新帖子不需要上传文件,前端可以不用FormData传参,直接发送普通JSON格式请求,现有body-parser配置就可以正常解析,前端代码修改为:
const updatePost = () => { if (textEdit) { axios.put(`http://localhost:5000/api/post/${id}`, { message: textEdit }, { headers: { Authorization: `Bearer ${sessionStorage.getItem("authToken")}`, 'Content-Type': 'application/json' }, }) .then((res) => { console.log(res); console.log(id) console.log(message) console.log(textEdit) }) } }
内容的提问来源于stack exchange,提问作者Edwin
相关产品推荐
相关产品推荐

