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