Иногда ошибки пугают, но на самом деле они делают наши приложения лучше, когда их нет рядом! Если мы правильно обработаем ошибки, наши фронтенд-команды будут очень благодарны.
«Какое простое действие вы могли бы предпринять сегодня, чтобы создать новый импульс к успеху в своей жизни?» -Тони Роббинс
Ошибки
Приложения, работающие в Node.js, обычно сталкиваются с четырьмя категориями ошибок:
- Стандартные ошибки JavaScript, такие как синтаксис, ссылка, тип и другие.
- Системные ошибки вызываются базовыми ограничениями операционной системы, такими как попытка открыть файл, который не существует, или попытка отправить данные через закрытый сокет.
- Пользовательские ошибки, вызванные кодом приложения.
AssertionError
s — это особый класс ошибок, которые могут быть вызваны, когда Node.js обнаруживает исключительное нарушение логики, которое никогда не должно происходить. Обычно они вызываются модулемassert
.
Все ошибки JavaScript и системные ошибки, вызванные Node.js, наследуются или являются экземплярами стандартного класса JavaScript ‹Error› и гарантированно предоставляют как минимум свойства, доступные в этом классе.
В нашем API мы возвращаем результат JSON для обработки. Но когда в нашем приложении возникает ошибка, оно возвращает такую информацию, как сообщение об ошибке и дерево стека нашего приложения. В этом случае пользователи могут узнать личную информацию нашего приложения и использовать ее в плохих целях. С другой стороны, наши товарищи по команде не могут понять, что происходит. Итак, при возникновении ошибки было бы неплохо отправить результаты JSON, такие как наши успешные результаты.
В предыдущих статьях мы видели, как мы создаем структуру приложения узла и папки. Мы строим вещи поверх него. Так что, если вы еще не читали, самое время.
Мы говорим, что наши приложения вернули успешный результат JSON:
{ "code": "0", "msg": "Success", "records": [ { "key": "rXOajnqt", "value": "QFKmpxRhmPPm", "count": 2169 } ] }
У нас есть 3 ключа.
код; Код результата. 0 означает успех. Другие коды будут использоваться для ошибок.
сообщение; Краткое описание результата
записи; Этот ключ встречается только в успешных результатах. Он содержит данные о результатах.
подробности; Возникает ошибка. Выдает подробные сообщения об ошибках.
пример ошибки;
{ "code": "4", "msg": "fail", "details": "No data found" }
Как вы видели; Атрибуты code и msg являются взаимными. Это облегчает понимание того, каковы наши результаты, в случае ошибки мы можем посмотреть на детали и исправить проблему.
Давайте углубимся в программирование!
Сначала создайте файл промежуточного программного обеспечения с именем errorHandler.js.
Это вызовет каждую ошибочную ситуацию. Это означает, что мы контролируем ошибки. У нас есть 4 параметра; ошибка, запрос, разрешение, следующий.
Параметр error получает ошибку, которую мы отправляем. У этого есть еще одна цель, о которой я упомяну позже в этой статье.
Я также интегрировал регистратор. Ведение журнала — одна из самых важных вещей. Впрочем, это тема для другого дня.
В девятой строке мы указываем статус ответа со статусом ошибки, если он нулевой, присваиваем значение по умолчанию. После этого, как и статус, назначьте сообщение об ошибке в JSON.
Так что же вызовет это промежуточное ПО?
2 вещи. Неуказанные конечные точки и другие ошибки.
Для другой ошибки я создал папку с именем errors и файл ApiError.js. Если хотите, можете поместить этот файл в scripts/utils.
Мы должны наследовать класс Error от javascript. Таким образом, мы можем получить доступ ко всем ошибкам. Получив доступ к ошибке, мы будем манипулировать ею с помощью этогоключевого слова. Если вы не понимаете, что происходит в этих строках, вы должны изучить ООП.
Наконец-то мы можем вызвать эту функцию и вернуть ошибку.
пример использования;
В этом примере; при проверке данных, если joi выдает ошибку, вызовите класс ошибки с помощью next.
Для неуказанных конечных точек вернитесь к файлу app.js. После всех конечных точек привяжите промежуточное ПО уровня приложения к экземпляру объекта приложения с помощью метода app.use(). Если пользователь отправляет запрос, который не соответствует ни одной конечной точке, этот запрос будет перехвачен. После этого, как и при любой другой ошибке, просто вызовите класс ошибки.
//this runs if the EP is not found app.use((req, res, next) => { next(new ApiError(`${req.method} ${req.path} endpoint not avaiable`, 404)); });
Наконец, мы должны вызвать промежуточное программное обеспечение обработчика ошибок в конце файла app.js. Если в приложении возникает ошибка, запускает промежуточное ПО обработчика ошибок, и мы можем вернуть ответ.
app.use(errorHandler);
Надеюсь, вам понравилось и вы узнали новое!