Как устроить обработку ошибок в API
Вопрос
Как бы ты организовал обработку ошибок в HTTP API на Express или NestJS?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Единый обработчик ошибок (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 ошибок.