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

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

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

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

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

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

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

  • Создать класс, реализующий интерфейс 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, который выводит в консоль информацию о каждом запросе.

  • Регистрация 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.

  • Использование глобального 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 для упрощения кода ваших контроллеров и для лучшего разделения ответственности в приложении.