Поиск по сайту
Ctrl + K
Вопросы по Nest.js

Что такое интерсептор в контексте NestJS?

В NestJS интерсепторы (interceptors) представляют собой мощный инструмент, позволяющий делать дополнительные действия во время обработки запроса и ответа. Они работают на уровне обработки запросов и могут манипулировать результатами или даже отменить выполнение обработчиков.

Основное использование интерсепторов включает:

  • Изменение данных запроса или ответа - можно изменять входные данные перед передачей их в обработчик или модифицировать данные ответа перед отправкой клиенту.
  • Логирование - использование интерсепторов для журналирования данных о запросах и ответах.
  • Измерение производительности - можно учитывать время выполнения обработчиков.
  • Обработка ошибок - можно перехватывать и обрабатывать ошибки, возникающие в обработчиках.
  • Как создать интерсептор

    Интерсептор создается как класс, который реализует интерфейс NestInterceptor из пакета @nestjs/common. Давайте рассмотрим пример простого интерсептора:

    import {
      Injectable,
      NestInterceptor,
      ExecutionContext,
      CallHandler,
    } from '@nestjs/common';
    import { Observable } from 'rxjs';
    import { tap } from 'rxjs/operators';
    
    @Injectable()
    export class LoggingInterceptor implements NestInterceptor {
      intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
        const request = context.switchToHttp().getRequest();
        const response = context.switchToHttp().getResponse();
    
        console.log(`Incoming Request: ${request.method} ${request.url}`);
    
        const start = Date.now();
    
        return next.handle().pipe(
          tap(() => {
            const end = Date.now();
            console.log(`Outgoing Response: ${response.statusCode} - ${end - start}ms`);
          }),
        );
      }
    }
    

    Пояснение к коду

    • Import: Импортируются необходимые декораторы и классы.
    • Injectable: Декоратор @Injectable() позволяет использовать этот интерсептор в других местах приложения.
    • intercept: Основной метод, который вызывается при выполнении запроса. Он получает контекст выполнения (ExecutionContext) и обработчик внутреннего вызова (CallHandler).
    • Логирование: Внутри метода intercept мы можем получить доступ к объекту запроса и ответа, и, например, вывести информацию о входящем запросе и затраченное время на ответ.

    Как использовать интерсептор в модуле

    Для использования интерсептора необходимо добавить его в провайдеры вашего модуля или же использовать глобально:

    import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
    import { APP_INTERCEPTOR } from '@nestjs/core';
    import { LoggingInterceptor } from './logging.interceptor';
    
    @Module({
      providers: [
        {
          provide: APP_INTERCEPTOR,
          useClass: LoggingInterceptor,
        },
      ],
    })
    export class AppModule {}
    

    Заключение

    Интерсепторы в NestJS — это мощное средство для модификации поведения HTTP-запросов и ответов, и они могут быть полезны для логирования, обработки ошибок и многого другого. Понимание и использование интерсепторов поможет вам создавать более эффективные и производительные приложения на NestJS.