Error handling with Mongoose

前端 未结 1 1658
误落风尘
误落风尘 2020-12-12 16:38

I am an absolute NodeJS beginner and want to create a simple REST-Webservice with Express and Mongoose.

Whats the best practice to handle errors of Mongoose in one c

相关标签:
1条回答
  • 2020-12-12 17:19

    If you're using Express, errors are typically handled either directly in your route or within an api built on top of mongoose, forwarding the error along to next.

    app.get('/tickets', function (req, res, next) {
      PlaneTickets.find({}, function (err, tickets) {
        if (err) return next(err);
        // or if no tickets are found maybe
        if (0 === tickets.length) return next(new NotFoundError));
        ...
      })
    })
    

    The NotFoundError could be sniffed in your error handler middleware to provide customized messaging.

    Some abstraction is possible but you'll still require access to the next method in order to pass the error down the route chain.

    PlaneTickets.search(term, next, function (tickets) {
      // i don't like this b/c it hides whats going on and changes the (err, result) callback convention of node
    })
    

    As for centrally handling mongoose errors, theres not really one place to handle em all. Errors can be handled at several different levels:

    connection errors are emitted on the connection your models are using, so

    mongoose.connect(..);
    mongoose.connection.on('error', handler);
    
    // or if using separate connections
    var conn = mongoose.createConnection(..);
    conn.on('error', handler);
    

    For typical queries/updates/removes the error is passed to your callback.

    PlaneTickets.find({..}, function (err, tickets) {
      if (err) ...
    

    If you don't pass a callback the error is emitted on the Model if you are listening for it:

    PlaneTickets.on('error', handler); // note the loss of access to the `next` method from the request!
    ticket.save(); // no callback passed
    

    If you do not pass a callback and are not listening to errors at the model level they will be emitted on the models connection.

    The key take-away here is that you want access to next somehow to pass the error along.

    0 讨论(0)
提交回复
热议问题