Що таке Interceptor?
1. Що таке Interceptor
Interceptor - це клас, що реалізує інтерфейс
NestInterceptor, який може перехоплювати потік виконання між клієнтом і контролером.
Він виконується після Guards і Pipes, але до відправки відповіді клієнту. Це робить його ідеальним для:
- логування;
- кешування;
- трансформації відповіді;
- вимірювання часу виконання;
- обгортки помилок;
- додавання метаданих.
2. Інтерфейс Interceptor
Будь-який перехоплювач реалізує метод:
intercept(context: ExecutionContext, next: CallHandler): Observable<any>context- доступ до даних про запит (контролер, хендлер, аргументи);next- об'єкт, що виконує контролер і повертає потік даних (Observable).
Приклад простого інтерцептора
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()) | усього застосунку |
Приклад підключення
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 у консолі:
-> GET /users
<- Done in 2ms4. Приклади використання Interceptor'ів
| Мета | Приклад |
|---|---|
| Логування | Час виконання, коди статусу |
| Трансформація відповіді | Прибрати зайві поля, додати метадані |
| Кешування | Повернути результат із кешу, якщо є |
| Метрики | Надіслати дані в Prometheus/Sentry |
| Обробка помилок | Перехопити винятки, повернути уніфіковану відповідь |
| Обгортка даних | Додати статус/метаінформацію до JSON |
| Модифікація запиту | Змінити дані в req до виклику контролера |
5. Приклад: трансформація відповіді
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(),
})),
);
}
}Результат:
{
"status": "success",
"data": { "id": 1, "name": "Alice" },
"timestamp": "2025-10-19T09:00:00Z"
}6. Порядок виконання пайплайну NestJS
Middleware → Guards → Pipes → Interceptors (до контролера)
→ Controller → Interceptors (після контролера)
→ Exception Filters → ResponseІнтерцептори "обгортають" контролер - вони виконуються до і після. Це робить їх схожими на middleware, але на рівні NestJS (у контексті DI, метаданих і RxJS).
Підсумок
Interceptor у NestJS - це перехоплювач, який може виконувати код до й після виклику методу контролера.
Використовується для:
- логування й метрик;
- трансформації відповіді;
- кешування;
- обробки помилок;
- вимірювання часу виконання.
Він - частина "execution context pipeline", виконується після Guards і Pipes, але до відправки відповіді клієнту.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.