Goran
Goran

Reputation: 1012

Catching errors from mongoose queries in express

How can I catch error from mongoose queries. In my routes I got something like this:

// router.js
router.route('/signup')
    .post(function(req, res) {
        var profile = new Profile(); // create a new instance of the profile model
        profile.username    = req.body.username;
        profile.password    = profile.generateHash(req.body.password);
        profile.save(function(err) {
            if (err) { // (A)
                throw new Error('user/create error'));
            } else {
                res.json(200, { user_token: profile._id, username: profile.username }); 
            }
        });
    });

and in my app were I set up my routes I got this:

// app.js
var router = require('./app/routes/routes'); 
// global-error handling middleware
app.use(function(err, req, res, next) {
    console.log('Some error is happening.');
    res.json(500, {status: 500, message: err.message});

});

If I generate a error so I get to line // (A) in my code above I get a stack trace and node.js exists. I want to catch the error In my error handler. How do I do this?

Upvotes: 3

Views: 4040

Answers (2)

eerFun
eerFun

Reputation: 143

you can use Promise-like error handling. mongoose permits to use promises on its methods:

profile.save().then((doc) => {
        // if done correctly
}).catch((err) => {
    // catch error if occurs
    // handle error
});
  • you can read more about mongoose built-in promises there.

Upvotes: 1

Edwin Dalorzo
Edwin Dalorzo

Reputation: 78639

Well, you are already in the request handler, and you already have access to the error produced while saving the profile object. So, there is no need to throw an exception here. You can already handle the problem.

The most likely scenario here is to send a response to the user indicating that the saving of the profile failed.

function(req, res) {
   profile.save(function(err) {
      if (err) { // (A)
        res.send(500, {message: 'Failed to save profile'}
      } else {
         res.json(200, { user_token: profile._id, username: profile.username }); 
      }
  });
}

And that's it. Your client will receive a 500 status error and this evidently represents a problem that your client will need to deal with, like notifying the user, doing a retry, etc, etc, etc.

Upvotes: 1

Related Questions