Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке Interceptor?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Interceptor - клас, що реалізує інтерфейс `NestInterceptor` і перехоплює потік виконання між клієнтом і контролером: метод `intercept(context, next)` виконує код до `next.handle()` (перед контролером) і після нього через `.pipe()` (після контролера), працюючи на RxJS Observable. **Ключове:** interceptors виконуються після Guards і Pipes, але до відправки відповіді клієнту, і типово застосовуються для логування, трансформації відповіді, кешування й вимірювання часу виконання.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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 Middleware → Guards → Pipes → Interceptors (до контролера) → Controller → Interceptors (після контролера) → Exception Filters → Response ``` Інтерцептори "обгортають" контролер - вони виконуються **до і після**. Це робить їх схожими на **middleware**, але на рівні NestJS (у контексті DI, метаданих і RxJS). ## Підсумок > **Interceptor у NestJS** - це перехоплювач, який може виконувати код **до й після** виклику методу контролера. > > Використовується для: > > - логування й метрик; > - трансформації відповіді; > - кешування; > - обробки помилок; > - вимірювання часу виконання. Він - частина **"execution context pipeline"**, виконується після **Guards** і **Pipes**, але до відправки відповіді клієнту.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.