Подтвердить что ты не робот

Обработка ошибок с помощью Mongoose

Я абсолютный новичок NodeJS и хочу создать простой REST-Webservice с помощью Express и Mongoose.

Какова наилучшая практика для обработки ошибок Mongoose в одном центральном месте?

В случае возникновения ошибки базы данных я хочу вернуть Http-500-Error-страницу с сообщением об ошибке:

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?

4b9b3361

Ответ 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 каким-то образом передал ошибку.