Вопросы по Nest.js

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

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

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

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

Как создать интерсептор

Интерсептор создается как класс, который реализует интерфейс 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.