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

Путь запроса в NestJS

Вопрос

Расскажите, через что проходит HTTP-запрос в NestJS от входа до ответа и где что уместно делать.

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

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

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

Коротко

Запрос сначала проходит middleware: это слой уровня Express или Fastify, он ничего не знает о хендлере, поэтому там логирование, cors, разбор тела. Дальше guards: они знают, какой хендлер будет вызван, и через Reflector читают метаданные, поэтому именно там аутентификация и проверка ролей.

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

  • Middleware: низкоуровневое, до роутинга (логирование, cors, raw body), как в Express

  • Guards: решение «пускать или нет» (аутентификация, роли), имеют `ExecutionContext` и метаданные хендлера

  • Interceptors до хендлера и после: трансформация ответа, тайминги, кеш, таймауты (RxJS вокруг вызова)

  • Pipes: валидация и преобразование аргументов (`ValidationPipe`, `ParseIntPipe`)

  • Хендлер контроллера вызывает сервисы; исключения ловят Exception filters и превращают в ответ

  • Порядок уровней: глобальные, потом контроллера, потом метода

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

  • Где проверять права на конкретный ресурс, а не роль?
  • Почему валидацию делают в pipe, а не в guard?
  • Как прокинуть trace id во все логи запроса?

Разбор

Запрос сначала проходит middleware: это слой уровня Express или Fastify, он ничего не знает о хендлере, поэтому там логирование, cors, разбор тела. Дальше guards: они знают, какой хендлер будет вызван, и через Reflector читают метаданные, поэтому именно там аутентификация и проверка ролей. Потом interceptors, которые оборачивают вызов: код до и после хендлера, тайминги, маппинг ответа, кеш, таймауты. Потом pipes валидируют и преобразуют аргументы, ValidationPipe с class-validator и whitelist. Затем хендлер, который вызывает сервисы. Любое исключение на этом пути ловят exception filters и превращают в HTTP-ответ. Каждый уровень можно повесить глобально, на контроллер и на метод, выполняются в этом порядке. Проверку доступа к конкретному объекту чаще делают в сервисе: guard не знает, принадлежит ли заказ пользователю, без загрузки заказа.

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

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