使用Express与Mongoose开发社交应用时遇ERR_HTTP_HEADERS_SENT错误,如何修复?
修复ERR_HTTP_HEADERS_SENT错误的方案
错误原因
你这段代码的核心问题是同时混用了await和回调函数。Mongoose的findOneAndUpdate方法,当使用await时会返回Promise形式的查询结果,无需额外传入回调;但你现在既用了await,又添加了回调函数,会导致重复发送HTTP响应:
- 回调函数里会触发
res.status(200).json(docs)或res.status(500).json({ message: err })发送响应; - 若方法执行抛出异常,
try/catch的catch块又会再次调用res.status(500).json({ message: err })发送响应。
重复响应就会触发ERR_HTTP_HEADERS_SENT错误。
修复后的代码
去掉回调函数,完全用async/await语法处理异步操作:
const UserModel = require("../models/user.model"); const ObjectID = require("mongoose").Types.ObjectId; module.exports.updateUser = async (req, res) => { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " + req.params.id); try { const docs = await UserModel.findOneAndUpdate( { _id: req.params.id }, { $set: { bio: req.body.bio, }, }, { new: true, upsert: true, setDefaultsOnInsert: true } ); return res.status(200).json(docs); } catch (err) { return res.status(500).json({ message: err }); } };
额外注意点
- 使用
async/await时,Mongoose异步方法成功时直接返回结果,失败时抛出异常,由catch统一捕获处理; - 务必保证每个请求只发送一次响应,避免在同一请求逻辑中多次调用
res.send、res.json这类方法。
内容的提问来源于stack exchange,提问作者user19363667
相关产品推荐
相关产品推荐

