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

Что такое промежуточные модули (middleware) в контексте NestJS?

Промежуточные модули (middleware) в NestJS представляют собой функции, которые имеют доступ к объекту запроса (request), объекту ответа (response) и функции следующего обработчика (next). Они используются для выполнения кода, изменения запроса и ответа, завершения запроса или вызова следующего middleware в цепочке.

Основные сценарии применения middleware:

  • Логирование запросов
  • Проверка подлинности (аутентификации)
  • Обработка ошибок
  • Обработка и модификация запросов и ответов

Определение middleware в NestJS

Чтобы создать middleware в NestJS, нужно сделать следующее:

  1. Создать класс, реализующий интерфейс NestMiddleware:
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(`Запрос к: ${req.url}`);
    next(); // передаем управление следующему middleware
  }
}

В этом примере мы создали middleware под названием LoggerMiddleware, который выводит в консоль информацию о каждом запросе.

  1. Регистрация middleware:

Middleware можно регистрировать на уровне модуля, контроллера или глобально. Чтобы зарегистрировать middleware на уровне модуля, нужно использовать метод configure в классе вашего модуля:

import { Module, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { SomeController } from './some.controller';

@Module({
  controllers: [SomeController],
})
export class SomeModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes({ path: 'some-route', method: RequestMethod.ALL });
  }
}

В этом примере мы зарегистрировали LoggerMiddleware для всех запросов к маршруту some-route.

  1. Использование глобального middleware:

Если вы хотите, чтобы middleware применялось ко всем маршрутам, вы можете зарегистрировать его глобально в файле main.ts:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { LoggerMiddleware } from './logger.middleware';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(LoggerMiddleware);  // Используем middleware глобально
  await app.listen(3000);
}
bootstrap();

Заключение

Middleware — это мощный инструмент в NestJS, который позволяет вам управлять потоком обработки запросов и ответов. С их помощью вы можете добавлять дополнительные уровни логики к вашему приложению, начиная с простого логирования и заканчивая сложными механиками обработки данных или аутентификации пользователей. Используйте middleware для упрощения кода ваших контроллеров и для лучшего разделения ответственности в приложении.