32

我是一个绝对的 NodeJS 初学者,想用 Express 和 Mongoose 创建一个简单的 REST-Webservice。

在一个中心位置处理 Mongoose 错误的最佳实践是什么?

当任何地方发生数据库错误时,我想返回一个带有错误消息的 Http-500-Error-Page:

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

但这似乎不起作用,我在Mongoose 官方文档中找不到有关此侦听器的内容。我是否在每次 Mongo 请求后检查错误?

4

1 回答 1

47

如果您使用 Express,错误通常直接在您的路由中或在构建于 mongoose 之上的 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
})

至于集中处理 mongoose 错误,实际上并没有一个地方可以处理所有错误。可以在几个不同的级别处理错误:

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某种方式访问​​以传递错误。

于 2012-08-18T05:39:46.947 回答