Home > Enterprise >  Mongoose : Cannot set headers after they are sent to the client
Mongoose : Cannot set headers after they are sent to the client

Time:01-12

I'm performing a put request on my database, so far everything is working as intended, but I have this annoying message in the console that I believe will hinder my progression.

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

I tried adding an else statement on the ifs and it's doesn't seem to solve the problem? Any ideas ?

A snippet of my code :

// 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');
  }
});

CodePudding user response:

This is not a Mongoose error.

In a few places of your code you are returning a response with res.json, but you are NOT using return, so your script will continue executing even if the response is sent and it will try to sent it again when it comes to the next res.json.

Just add return before each res.json statement.

return res.json(result);
  •  Tags:  
  • Related