误差处理猫鼬(Error handling with Mongoose)

2019-06-26 21:13发布

我是一个绝对的初学者的NodeJS并希望创建一个简单的REST的web服务与快递和猫鼬。

最新最好的做法来处理猫鼬的错误,在一个集中的地方?

当任何地方发生的数据库错误我想用一个错误信息返回一个Http-500-错误页:

if(error) {
  res.writeHead(500, {'Content-Type': 'application/json'});
  res.write('{error: "' + error + '"}');
  res.end();
}

在旧的辅导http://blog-next-stage.learnboost.com/mongoose/我读到一个全局错误监听器:

Mongoose.addListener('error',function(errObj,scope_of_error));

但是,这似乎并没有工作,我无法找到的东西官方文档猫鼬这个监听器。 难道我每次Mongo的请求后,检查是否存在错误?

Answer 1:

如果您使用快递,错误通常可以直接在您的路线或建立在猫鼬之上的API中处理,一起转发错误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));
    ...
  })
})

NotFoundError可以在被嗅探的错误处理中间件提供量身定制的消息。

有些抽象是可能的,但你仍然需要访问到next方法,以通过降低错误的路线链。

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
})

至于集中处理猫鼬错误,那里有没有真正一个地方处理他​​们所有。 错误可以在几个不同的层次来处理:

connection错误发出的上connection您的模型正在使用,所以

mongoose.connect(..);
mongoose.connection.on('error', handler);

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

对于典型的查询/更新/删除错误传递给你的回调。

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

如果不传递一个回调发射模型上的错误,如果你在听吧:

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

如果不传递回调,而不是听的误差model水平,他们将在模型上发出的connection

关键外卖这里是你希望获得next以某种方式传递下去的错误。



文章来源: Error handling with Mongoose