Search code examples
expressmongoosemongoose-schema

Using Mongoose pre save hook result in: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client


I am trying to hook into the save function in Mongoose to return an error to the client of a REST API if a certain condition is not met in the schema. I can't use a validator for this as the restriction is calculated over multiple fields of the schema.

I am trying to add a hook in the following style:

mySchema.pre('save', function (next) {
  if(condition_is_not_met) {
    const err = new Error('Condition was not met');
    next(err);
  }
  next();
});

This throws an error when I try to make a call to the endpoint trying to insert an object that violates the condition checked for in the hook:

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

I am guessing that this happens because execution continues on the route writing the header to send it to the client.

router.post('/mySchema', returnType, (req, res) => {
  const s = new mySchema(req.body);
  s.save((err) => {
    if (err) {
      const msg = { message: 'Could not add', error: err }; // This is returned to the caller
      res.status(500);
      res.send(msg);
    }
    res.status(200);
    res.send(s);
  });
});

How can i fix this issue? I have been searching quite a bit but the topics I found so far do not help me to solve my issue. They only helped me to identify the cause without offering a working solution.


Solution

  • did you try having an else branch for the success response? Since even if the object is invalid the success response will still be executed. Try it like below

    router.post("/mySchema", returnType, (req, res) => {
      const s = new mySchema(req.body);
      s.save(err => {
        if (err) {
          const msg = { message: "Could not add", error: err };
          res.status(500);
          res.send(msg);
        } else {
          res.status(200);
          res.send(s);
        }
      });
    });
    

    Pardon my code formatting, I am AFK