You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Express与Mongoose开发社交应用时遇ERR_HTTP_HEADERS_SENT错误,如何修复?

修复ERR_HTTP_HEADERS_SENT错误的方案

错误原因

你这段代码的核心问题是同时混用了await和回调函数。Mongoose的findOneAndUpdate方法,当使用await时会返回Promise形式的查询结果,无需额外传入回调;但你现在既用了await,又添加了回调函数,会导致重复发送HTTP响应:

  1. 回调函数里会触发res.status(200).json(docs)或res.status(500).json({ message: err })发送响应;
  2. 若方法执行抛出异常,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:15:33