Что такое промежуточные модули (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 на уровне модуля, нужно использовать метод 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 применялось ко всем маршрутам, вы можете зарегистрировать его глобально в файле 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 для упрощения кода ваших контроллеров и для лучшего разделения ответственности в приложении.