Can't see where multiple call of res caused the error : Cannot set headers after they are sent to the client

Can't see where multiple call of res caused the error : Cannot set headers after they are sent to the client

我正在学习网上的教程。这是 mongo/mongoose 的 MERN 项目。当我在控制器中实现更新功能时,发生了以下错误:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

我看过类似问题的答案,他们说这是因为有 2 次或多次调用 res(res.json()、res.send() 等),但我看不到我必须在以下函数中更改它的位置:

module.exports.updateUser = async(req, res) => {
if (!ObjectID.isValid(req.params.id))
    return res.status(400).send("ID unknown : " + req.params.id);

try {
    await UserModel.findOneAndUpdate({
            _id: req.params.id
        }, {
            $set: {
                bio: req.body.bio
            }
        },
        (err, docs) => {
            if (!err)
                return res.send(docs);
            if (err)
                return res.status(500).send({ message: err });
        }
    )
} catch (err) {
    return res.status(500).json({ message: err });
}

};

你能不能把代码改成这样:

module.exports.updateUser = async(req, res) => {
  if (!ObjectID.isValid(req.params.id))
      return res.status(400).send("ID unknown : " + req.params.id);
  
  try {
      const result = await UserModel.findOneAndUpdate({
              _id: req.params.id
          }, {
              $set: {
                  bio: req.body.bio
              }
          });
      return res.send(result);
  } catch (err) {
      return res.status(500).json({ message: err });
  }
  };

您可能混淆了两种不同的错误处理模式。

如果您使用 findOneAndUpdate()

的内置错误处理,则不需要 try/catch

await UserModel.findOneAndUpdate({
            _id: req.params.id
        }, {
            $set: {
                bio: req.body.bio
            }
        },
        (err, docs) => {
            if (!err)
                return res.send(docs);
            if (err)
                return res.status(500).send({ message: err });
        }
)

如果您正在使用 try/catch,则不需要 findOneAndUpdate 的错误处理:

try {
    const user = await UserModel.findOneAndUpdate({
            _id: req.params.id
        }, {
            $set: {
                bio: req.body.bio
            }
        })

    return res.send(user)
} catch (err) {
    return res.status(500).json({ message: err });
}