Как обрабатывать ошибки в Node.js с помощью Express - PullRequest
12 голосов
/ 10 февраля 2012

Я работаю с партнером над проектом.Он написал много кода на Node.js + Express, но у нас возникли проблемы с архитектурой.

Чтобы исправить это, моя основная задача заключалась в том, чтобы найти лучший способ создания архитектуры.Node.js + Экспресс приложение.Я столкнулся с двумя сценариями, связанными с ошибками, и хотел бы получить несколько советов.

Во-первых, как мне регистрировать исключения верхнего уровня?Последнее, что я хочу, это ошибка, чтобы полностью убить процесс узла.Я хочу продолжать обслуживать пользователей перед лицом любой ошибки.

Во-вторых, некоторые ошибки передаются через обратные вызовы (мы используем caolan / async ).Как часть каждого обработчика маршрута, мы либо визуализируем представление (GET), перенаправляем на другой маршрут (POST), и мы хотим перенаправить на экран ошибок с пользовательским сообщением об ошибке.Как я могу убедиться, что захватил эту логику в одном месте ?

Ответы [ 3 ]

13 голосов
/ 10 февраля 2012

Во-первых, как мне регистрировать исключения верхнего уровня? Последнее, что я хочу, это ошибка, чтобы полностью убить процесс узла. Я хочу продолжать обслуживать пользователей перед лицом любой ошибки.

Редактировать: Я думаю, что философия узла в целом заключается в том, что любые необработанные исключения должны уничтожить процесс, и что вы должны запускать приложение вашего узла под каким-то монитором процесса с соответствующей регистрацией объекты. Следующий совет касается любых других ошибок, с которыми вы можете столкнуться в обработчиках экспресс-маршрутов и т. Д.

Express имеет общий обработчик ошибок, который должен регистрировать все сгенерированные ошибки, а также все, что передается в качестве параметра next в ваших маршрутах / промежуточном программном обеспечении, и отвечать 500 Internal Server Error.

Во-вторых, некоторые ошибки передаются через обратные вызовы (мы используем caolan / async). Как часть каждого обработчика маршрута, мы либо визуализируем представление (GET), перенаправляем на другой маршрут (POST), и мы хотим перенаправить на экран ошибок с пользовательским сообщением об ошибке. Как я могу сделать так, чтобы эта логика была в одном месте?

Вы можете создать пользовательский handleError, который вы вызываете при каждом обратном вызове, например:

async.series(..., function(err, results) {
  if(err)
    return handleError(req, res, err);
  // ...
});

Или вы можете просто передать ошибки с помощью next(err) и реализовать свой собственный обработчик ошибок, как описано здесь: http://expressjs.com/guide/error-handling.html

4 голосов
/ 10 февраля 2012

Исключения верхнего уровня:

Вы можете использовать событие uncaughtException из процесса , но обычно это не рекомендуется.

Часто приложения переходят в поврежденное состояние (например, у вас есть состояние, которое обычно устанавливается, но исключение вызвало то, что этого не произошло), когда возникает исключение. Тогда это будет вызывать все больше и больше ошибок с этого момента.

Рекомендуется использовать что-то вроде forever для автоматического перезапуска приложения в случае его сбоя. Таким образом, вы получите приложение в нормальном состоянии даже после сбоя.

Обработка ошибок в экспрессе:

Вы можете создать новый экземпляр Error и передать его следующему обратному вызову в цепочке.

Например.

express.get('/some/url', function(req, res, next) {
    //something here
    if(error) {
        next(new Error('blah blah'));
    }
});

Для дальнейшей обработки ошибки вы можете установить обработчик ошибок. См. экспресс-документы по обработке ошибок

3 голосов
/ 15 мая 2012

Оформить заказ на отличный модуль обработки логов Winston: https://github.com/flatiron/winston

Позволяет настроить обработку исключений таким образом, чтобы он не только регистрировал его, но и позволял продолжить процесс. И, поскольку это, очевидно, будет серьезной проблемой, вы даже можете настроить Winston для отправки электронных писем по определенным типам событий (например, исключениям).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...