Обработка ошибок¶
Функции промежуточного обработчика для обработки ошибок определяются так же, как и другие функции промежуточной обработки, но с указанием для функции обработки ошибок не трех, а четырех аргументов: (err, req, res, next)
. Например:
1 2 3 4 |
|
Промежуточный обработчик для обработки ошибок должен быть определен последним, после указания всех app.use()
и вызовов маршрутов; например:
1 2 3 4 5 6 7 8 |
|
Ответы, поступающие из функции промежуточной обработки, могут иметь любой формат, в зависимости от ваших предпочтений. Например, это может быть страница сообщения об ошибке HTML, простое сообщение или строка JSON.
В целях упорядочения (и для фреймворков более высокого уровня) можно определить несколько функций промежуточной обработки ошибок, точно так же, как это допускается для обычных функций промежуточной обработки. Например, для того чтобы определить обработчик ошибок для запросов, совершаемых с помощью XHR
, и для остальных запросов, можно воспользоваться следующими командами:
1 2 3 4 5 6 7 8 |
|
В данном примере базовый код logErrors
может записывать информацию о запросах и ошибках в stderr
, например:
1 2 3 4 |
|
Кроме того, в данном примере clientErrorHandler
определен, как указано ниже; в таком случае ошибка явным образом передается далее следующему обработчику:
1 2 3 4 5 6 7 8 9 |
|
"Обобщающая" функция errorHandler
может быть реализована так:
1 2 3 4 |
|
При передаче какого-либо объекта в функцию next()
(кроме строки 'route'
), Express интерпретирует текущий запрос как ошибку и пропустит все остальные функции маршрутизации и промежуточной обработки, не являющиеся функциями обработки ошибок. Для того чтобы обработать данную ошибку определенным образом, необходимо создать маршрут обработки ошибок, как описано в следующем разделе.
Если задан обработчик ошибок с несколькими функциями обратного вызова, можно воспользоваться параметром route
, чтобы перейти к следующему обработчику маршрута. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
В данном примере обработчик getPaidContent
будет пропущен, но выполнение всех остальных обработчиков в app
для /a_route_behind_paywall
будет продолжено.
Вызовы next()
и next(err)
указывают на завершение выполнения текущего обработчика и на его состояние. next(err)
пропускает все остальные обработчики в цепочке, кроме заданных для обработки ошибок, как описано выше.
Стандартный обработчик ошибок¶
В Express предусмотрен встроенный обработчик ошибок, который обрабатывает любые возможные ошибки, встречающиеся в приложении. Этот стандартный обработчик ошибок добавляется в конец стека функций промежуточной обработки.
В случае передачи ошибки в next()
без обработки с помощью обработчика ошибок, такая ошибка будет обработана встроенным обработчиком ошибок. Ошибка будет записана на клиенте с помощью трассировки стека. Трассировка стека не включена в рабочую среду.
Для запуска приложения в рабочем режиме необходимо задать для переменной среды NODE_ENV
значение production
.
При вызове next()
с ошибкой после начала записи ответа (например, если ошибка обнаружена во время включения ответа в поток, направляемый клиенту), стандартный обработчик ошибок Express закрывает соединение и отклоняет запрос.
Поэтому при добавлении нестандартного обработчика ошибок вам потребуется делегирование в стандартные механизмы обработки ошибок в Express в случае, если заголовки уже были отправлены клиенту:
1 2 3 4 5 6 7 |
|