如果您使用 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
某种方式访问以传递错误。