> Работали ли вы с интерцепторами в NestJS (JavaScript)
Уровень: senior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы
Компании: TrendTech
Стек: Node.js, JavaScript, NestJS
> Пример ответа
Короткий ответ
Да, я работал с интерцепторами в NestJS. Это ключевой механизм для перехвата и трансформации входящих/исходящих данных на уровне HTTP-запросов. Интерцепторы реализуют паттерн перехватчика, позволяя выполнять дополнительную логику до и после обработки запроса контроллером. Основные сценарии - логирование, трансформация ответов, кэширование, обработка ошибок.
Подробное объяснение
Интерцепторы в NestJS - это классы, декорированные @Injectable(), которые реализуют интерфейс NestInterceptor. Они работают на уровне middleware, но имеют доступ к контексту выполнения и могут изменять поток данных. Каждый интерцептор имеет метод intercept(), который принимает ExecutionContext и CallHandler. CallHandler предоставляет метод handle(), который запускает следующий обработчик в цепочке.
Ключевое отличие от middleware - интерцепторы могут трансформировать ответ, а не только перехватывать запрос. Они работают с Observable из RxJS, что позволяет применять операторы для манипуляции потоком данных. Интерцепторы могут быть глобальными, контроллерными или точечными (через декоратор @UseInterceptors()).
Основные use cases:
- Логирование времени выполнения запросов
- Трансформация ответов (добавление обёртки, форматирование)
- Кэширование ответов
- Обработка ошибок и их трансформация
- Добавление метаданных в response headers
На практике
В реальных проектах я использовал интерцепторы для:
- Логирования всех входящих запросов с duration и status code
- Трансформации всех ответов в единый формат
{ data, meta, error } - Добавления CORS-заголовков и security headers
- Реализации rate limiting через проверку количества запросов
Важно помнить, что порядок выполнения интерцепторов имеет значение. Если несколько интерцепторов применены к одному эндпоинту, они выполняются в порядке их объявления. Глобальные интерцепторы выполняются раньше контроллерных.
Пример кода
TYPESCRIPTimport { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';import { Observable } from 'rxjs';import { map } from 'rxjs/operators';@Injectable()export class TransformInterceptor implements NestInterceptor {intercept(context: ExecutionContext, next: CallHandler): Observable<any> {const now = Date.now();return next.handle().pipe(map(data => ({status: 'success',data,timestamp: new Date().toISOString(),duration: Date.now() - now,})),);}}// Использование в контроллере@Controller('users')@UseInterceptors(TransformInterceptor)export class UsersController {@Get()findAll() {return [{ id: 1, name: 'John' }];}}
Как отвечать на собеседовании
Начни с конкретного примера использования, затем объясни механизм работы. Упомяни, что интерцепторы работают с RxJS Observable, что даёт гибкость в трансформации данных. Подчеркни разницу между интерцепторами и middleware: интерцепторы имеют доступ к контексту выполнения и могут изменять ответ, а middleware - нет. Хорошо бы упомянуть про порядок выполнения и про то, как интерцепторы могут быть глобальными или локальными.
Что проверяет интервьюер
- Понимание паттерна перехватчика и его места в жизненном цикле запроса
- Знание механизмов NestJS: декораторы, DI, контекст выполнения
- Умение работать с RxJS и понимание реактивного программирования
- Способность различать middleware, guards, pipes и interceptors
- Практический опыт применения в реальных проектах
Типичные ошибки
- Путать интерцепторы с guards или pipes - они решают разные задачи
- Забывать вызвать
next.handle()- без этого запрос не дойдёт до контроллера - Не учитывать, что интерцепторы работают с Observable, а не с Promise напрямую
- Применять глобальные интерцепторы без необходимости - это может замедлить все запросы
- Не обрабатывать ошибки внутри pipe - если интерцептор выбрасывает исключение, оно не будет обработано глобальным exception filter
> Похожие задачи по JavaScript
Как Node.js работает с файловой системой и какие библиотеки используются
Какой опыт работы с NestJS
Как проходят этапы разработки: спринты, дели, ретроспективы
Как хранятся коллекции по иерархии - как объекты или ссылки
> Похожие задачи по frontend
Как выявлять и исправлять утечки памяти
Какой опыт работы с NestJS
Как проходят этапы разработки: спринты, дели, ретроспективы
Как хранятся коллекции по иерархии - как объекты или ссылки
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью