Как ты обрабатываешь ошибки в Node-сервисе
Вопрос
Расскажи, как ты организуешь обработку ошибок в бэкенде на Node.js.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Делю ошибки на операционные (обработать) и программные (починить, процесс упасть)
Свои классы ошибок со статусом и кодом, исходная причина в cause
Один централизованный обработчик: error middleware в Express или exception filter в NestJS
Клиенту безопасный ответ без стека, в лог всё с request id
unhandledRejection и uncaughtException: лог, Sentry/GlitchTip, выход; перезапускает оркестратор
Не глотать ошибки пустым catch и не логировать одну ошибку много раз
Что могут спросить следом
- Где логировать ошибку: там, где поймал, или наверху?
- Как отличить 4xx от 5xx в централизованном обработчике?
- Как сделать повтор только для временных ошибок?
Разбор
Сначала разделяю ошибки. Операционные, например таймаут базы или невалидный ввод, ожидаемы, их обрабатываю: повтор, понятный ответ клиенту, запасной путь. Программные это баги, их не прячу.
Для бизнес-ошибок завожу свои классы: NotFoundError, ValidationError, ConflictError, у каждой HTTP-статус и машинный код. Оборачивая низкоуровневую ошибку, передаю её в cause, чтобы не терять причину.
Обработка в одном месте: error middleware в Express или exception filter в NestJS. Он превращает известные ошибки в нужный статус, а всё неизвестное в 500 с общим текстом без стека. В лог идёт полная информация с request id, и ошибка логируется один раз, именно там.
На глобальные unhandledRejection и uncaughtException вешаю логирование и отправку в систему ошибок, после чего процесс завершается: состояние после непойманной ошибки ненадёжно, а перезапуск сделает оркестратор.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.