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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:36:06