MERN项目updateUser接口报Cannot set headers错误 找不到多调用res位置
问题排查及解决方案
报错根因
你的代码中UserModel.findOneAndUpdate同时使用了await异步等待和回调函数两种异步处理方式,二者会并行执行,导致响应重复发送:
- 首先回调函数内部的
res.send()/res.status(500).send()会先执行,第一次向客户端返回响应 - 后续
await执行过程中如果抛出异常,会触发catch块的res.status(500).json(),第二次尝试发送响应,就触发了对应报错。
修复方案
二选一即可,不要混用两种异步处理逻辑:
方案1:仅使用async/await写法
module.exports.updateUser = async(req, res) => { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " + req.params.id); try { // 去掉回调函数,用变量接收更新结果 const updatedUser = await UserModel.findOneAndUpdate( { _id: req.params.id }, { $set: { bio: req.body.bio } }, { new: true } // 可选参数:返回更新后的用户文档,默认返回更新前的旧数据 ) return res.send(updatedUser); } catch (err) { return res.status(500).json({ message: err }); } };
方案2:仅使用回调函数写法
// 去掉async标识,删除try catch块 module.exports.updateUser = (req, res) => { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " + req.params.id); UserModel.findOneAndUpdate( { _id: req.params.id }, { $set: { bio: req.body.bio } }, (err, docs) => { if (!err) return res.send(docs); return res.status(500).send({ message: err }); } ) };
内容的提问来源于stack exchange,提问作者Massine Oueslati
相关产品推荐
相关产品推荐

