Node.js执行updateUser更新用户时报ERR_HTTP_HEADERS_SENT错误
报错根因
你触发ERR_HTTP_HEADERS_SENT错误的核心原因是同时混用了mongoose查询的async/await异步语法和回调函数处理逻辑,同一次请求里两次尝试返回HTTP响应,导致服务端重复设置响应头触发报错。findOneAndUpdate方法在传入回调函数时会立刻执行回调逻辑返回响应,同时你用await关键字等待该方法的Promise返回,后续逻辑会二次操作响应对象,就触发了该错误。
修复方案
删除回调函数,统一使用async/await语法处理查询结果即可,修正后的代码如下:
module.exports.updateUser = async (req, res) => { if (!ObjectId.isValid(req.params.id)) return res.status(404).send("ID unknown : " + req.params.id); try { // 去掉回调,用变量接收await返回的查询结果 const updatedUser = await UserModel.findOneAndUpdate( { _id: req.params.id }, { $set: { bio: req.body.bio, }, }, { new: true, upsert: true, setDefaultsOnInsert: true } ); // 统一在这里返回响应 return res.send(updatedUser); } catch (err) { return res.status(500).json({ message: err }); } };
补充说明
- 如果你偏好使用回调函数处理查询结果,可以去掉
await关键字,同时删除外层的try/catch逻辑,所有错误和返回都放在回调内处理即可,两种语法不要混用。 - 修正后重启服务即可正常更新bio字段并返回更新后的用户文档。
内容的提问来源于stack exchange,提问作者RitalCharmant
相关产品推荐
相关产品推荐

