【问题标题】:Mongoose : Cannot set headers after they are sent to the clientMongoose:发送到客户端后无法设置标头
【发布时间】:2022-01-11 23:04:26
【问题描述】:

我正在对我的数据库执行 put 请求,到目前为止一切都按预期工作,但我在控制台中有一条烦人的消息,我认为这会阻碍我的进展。

Cannot set headers after they are sent to the client
[0] (node:13816) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

我尝试在ifs 上添加else 语句,但似乎并没有解决问题?有什么想法吗?

我的代码的 sn-p :

// PUT api/requests/upvote/:id
// Upvote or downvote a post
// Private
router.put('/response/upvote/:id/:response_id', auth, async (req, res) => {
  try {
    const request = await Requests.findById(req.params.id);
    //Pull out response

    const array = request.responses.filter((item) => item.id.toString());
    const result = array.find(
      (response) => response.id === req.params.response_id
    );

    if (req.body.vote_type === 'upvote') {
      if (
        result.upvotes.filter(
          (upvote) =>
            upvote.user.toString() === req.user.id &&
            upvote.vote_type === 'downvote'
        ).length > 0
      ) {
        const removeIndex = result.upvotes
          .map(
            (upvote) =>
              upvote.user.toString() === req.user.id &&
              upvote.vote_type === 'downvote'
          )
          .indexOf(req.user.id);

        result.upvotes.splice(removeIndex, 1);

        result.upvotes.push({
          user: req.user.id,
          vote_type: req.body.vote_type,
        });
        await request.save();
        res.json(result.upvotes);
      }

      if (
        result.upvotes.filter(
          (upvote) =>
            upvote.user.toString() === req.user.id &&
            upvote.vote_type === 'upvote'
        ).length > 0
      ) {
        res.status(400).send('You already upvoted this suggestion');
      } else {
        result.upvotes.push({
          user: req.user.id,
          vote_type: req.body.vote_type,
        });
        await request.save();
        res.json(result.upvotes);
      }
    }

    if (req.body.vote_type === 'downvote') {
      if (
        result.upvotes.filter(
          (upvote) =>
            upvote.user.toString() === req.user.id &&
            upvote.vote_type === 'upvote'
        ).length > 0
      ) {
        const removeIndex = result.upvotes
          .map(
            (upvote) =>
              upvote.user.toString() === req.user.id &&
              upvote.vote_type === 'upvote'
          )
          .indexOf(req.user.id);

        result.upvotes.splice(removeIndex, 1);

        result.upvotes.push({
          user: req.user.id,
          vote_type: req.body.vote_type,
        });
        await request.save();
        res.json(result.upvotes);
      }

      if (
        result.upvotes.filter(
          (upvote) =>
            upvote.user.toString() === req.user.id &&
            upvote.vote_type === 'downvote'
        ).length > 0
      ) {
        res.status(400).send('You already downvoted this suggestion');
      } else {
        result.upvotes.push({
          user: req.user.id,
          vote_type: req.body.vote_type,
        });
        await request.save();
        res.json(result.upvotes);
      }
    }
  } catch (error) {
    console.error(error.message);
    res.status(500).send('Server Error');
  }
});

【问题讨论】:

    标签: node.js database mongodb express mongoose


    【解决方案1】:

    这不是 Mongoose 错误。

    在您的代码的一些地方,您正在返回带有res.json 的响应,但您使用return,因此即使发送了响应并且您的脚本将继续执行下次res.json时会尝试再次发送。

    只需在每个 res.json 语句之前添加 return

    return res.json(result);
    

    【讨论】:

    • 我正要发布解决方案。它确实在res.json 之前添加了回报。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2021-09-11
    • 2018-05-25
    • 2021-06-27
    相关资源
    最近更新 更多