Ответ вслух Middle HTTP-сервер, Express, NestJS обновлено

Как устроить обработку ошибок в API

Вопрос

Как бы ты организовал обработку ошибок в HTTP API на Express или NestJS?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Я делаю одну точку, куда стекаются все ошибки. В Express это middleware с четырьмя параметрами, в NestJS глобальный exception filter.

Что должно прозвучать в ответе

  • Единый обработчик ошибок (error middleware в Express, exception filter в Nest)

  • Свои классы ошибок с HTTP-статусом и машинным кодом

  • Единый формат ответа об ошибке, без стека и внутренних деталей наружу

  • Логирование 5xx со стеком и id запроса

  • Async-ошибки: Express 5 ловит сам, в Express 4 обёртка

  • Валидация входа на границе: 400/422 до бизнес-логики

Что могут спросить следом

  • Что отдавать клиенту при ошибке базы данных?
  • Чем операционная ошибка отличается от программной?

Разбор

Я делаю одну точку, куда стекаются все ошибки. В Express это middleware с четырьмя параметрами, в NestJS глобальный exception filter. Обработчики роутов ничего не форматируют, они бросают ошибку.

Для ожидаемых ситуаций заводятся свои классы ошибок: NotFound, Forbidden, Conflict, у каждой HTTP-статус и машинный код вроде USER_NOT_FOUND. Фронтенд опирается на код, а не на текст.

Клиент всегда получает один формат: код, понятное сообщение, id запроса. Стек и тексты ошибок базы наружу не уходят, это утечка информации. Неожиданные ошибки превращаются в 500, а в лог пишутся целиком со стеком и тем же id запроса, чтобы найти их по жалобе.

Валидацию входа делаю на границе, через ValidationPipe в Nest или схему в Fastify, чтобы до бизнес-логики не доходили кривые данные. И слежу за async-ошибками: Express 5 передаёт их в обработчик сам, в Express 4 нужна обёртка.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.