Ответ 1
Если вы используете Express, ошибки обычно обрабатываются либо непосредственно на вашем маршруте, либо внутри api, построенного поверх mongoose, пересылая ошибку до 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
каким-то образом передал ошибку.