Skip to main content

Що таке Interceptor?

1. Що таке Interceptor

Interceptor - це клас, що реалізує інтерфейс NestInterceptor, який може перехоплювати потік виконання між клієнтом і контролером.

Він виконується після Guards і Pipes, але до відправки відповіді клієнту. Це робить його ідеальним для:

  • логування;
  • кешування;
  • трансформації відповіді;
  • вимірювання часу виконання;
  • обгортки помилок;
  • додавання метаданих.

2. Інтерфейс Interceptor

Будь-який перехоплювач реалізує метод:

javascript
intercept(context: ExecutionContext, next: CallHandler): Observable<any>
  • context - доступ до даних про запит (контролер, хендлер, аргументи);
  • next - об'єкт, що виконує контролер і повертає потік даних (Observable).

Приклад простого інтерцептора

javascript
import { Injectable, NestInterceptor, ExecutionContext, CallHandler, } from '@nestjs/common'; import { Observable, tap } from 'rxjs'; @Injectable() export class LoggingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { const now = Date.now(); const request = context.switchToHttp().getRequest(); console.log(`-> ${request.method} ${request.url}`); return next .handle() .pipe(tap(() => console.log(`<- Done in ${Date.now() - now}ms`))); } }

Тут:

  • Код до next.handle() виконується до контролера;
  • Код усередині .pipe() - після того, як контролер повернув результат.

3. Підключення Interceptor'ів

Можна використовувати на трьох рівнях:

РівеньПрикладЗастосовується до
Метод@UseInterceptors(LoggingInterceptor)одного методу
Контролер@UseInterceptors(LoggingInterceptor)усього контролера
Глобальноapp.useGlobalInterceptors(new LoggingInterceptor())усього застосунку

Приклад підключення

javascript
import { Controller, Get, UseInterceptors } from '@nestjs/common'; import { LoggingInterceptor } from './logging.interceptor'; @Controller('users') @UseInterceptors(LoggingInterceptor) export class UsersController { @Get() findAll() { return ['Alice', 'Bob', 'Charlie']; } }

При запиті GET /users у консолі:

javascript
-> GET /users <- Done in 2ms

4. Приклади використання Interceptor'ів

МетаПриклад
ЛогуванняЧас виконання, коди статусу
Трансформація відповідіПрибрати зайві поля, додати метадані
КешуванняПовернути результат із кешу, якщо є
МетрикиНадіслати дані в Prometheus/Sentry
Обробка помилокПерехопити винятки, повернути уніфіковану відповідь
Обгортка данихДодати статус/метаінформацію до JSON
Модифікація запитуЗмінити дані в req до виклику контролера

5. Приклад: трансформація відповіді

javascript
import { Injectable, NestInterceptor, CallHandler, ExecutionContext } from '@nestjs/common'; import { map, Observable } from 'rxjs'; @Injectable() export class TransformResponseInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { return next.handle().pipe( map((data) => ({ status: 'success', data, timestamp: new Date().toISOString(), })), ); } }

Результат:

javascript
{ "status": "success", "data": { "id": 1, "name": "Alice" }, "timestamp": "2025-10-19T09:00:00Z" }

6. Порядок виконання пайплайну NestJS

javascript
MiddlewareGuardsPipesInterceptors (до контролера) ControllerInterceptors (після контролера) Exception FiltersResponse

Інтерцептори "обгортають" контролер - вони виконуються до і після. Це робить їх схожими на middleware, але на рівні NestJS (у контексті DI, метаданих і RxJS).

Підсумок

Interceptor у NestJS - це перехоплювач, який може виконувати код до й після виклику методу контролера.

Використовується для:

  • логування й метрик;
  • трансформації відповіді;
  • кешування;
  • обробки помилок;
  • вимірювання часу виконання.

Він - частина "execution context pipeline", виконується після Guards і Pipes, але до відправки відповіді клієнту.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.