> Работали ли вы с интерцепторами в 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 через проверку количества запросов

Важно помнить, что порядок выполнения интерцепторов имеет значение. Если несколько интерцепторов применены к одному эндпоинту, они выполняются в порядке их объявления. Глобальные интерцепторы выполняются раньше контроллерных.

Пример кода

TYPESCRIPT
import { 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

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью