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

Как обращаться с ошибками в Node.js с помощью Express

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

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

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

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

4b9b3361

Ответ 1

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

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

Express имеет общую ошибкуHandler, которая должна захватывать все брошенные ошибки, а также все, переданные как параметр 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

Ответ 2

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

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

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

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

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

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

Eg.

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

Чтобы обработать ошибку здесь, вы можете установить обработчик ошибок. См. выразить документы об обработке ошибок

Ответ 3

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

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