Как обращаться с ошибками в Node.js с помощью Express
Я работаю с партнером по проекту. Он написал много кода в Node.js + Express, но мы столкнулись с проблемами с архитектурой.
Чтобы исправить это, моя основная роль заключалась в том, чтобы найти лучший способ архитектовать приложение Node.js + Express. Я столкнулся с двумя сценариями, связанными с ошибками, и мне хотелось бы получить некоторые предложения.
Во-первых, как я могу захватить исключения верхнего уровня? Последнее, что я хочу, это ошибка для полного уничтожения процесса node. Я хочу продолжать обслуживать пользователей перед любой ошибкой.
Во-вторых, некоторые ошибки передаются через обратные вызовы (мы используем caolan/async). Как часть каждого обработчика маршрута, мы визуализируем представление (GET), перенаправляем на другой маршрут (POST), и мы хотим перенаправить на экран ошибки с настраиваемым сообщением об ошибке. Как я могу убедиться, что эту логику можно зафиксировать в одном месте?
Ответы
Ответ 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 на отправку сообщений электронной почты на определенные типы событий (например, исключения).