Що таке Middleware в NestJS?
1. Що таке Middleware в NestJS
Middleware - це функція (чи клас), яка виконується до того, як запит потрапить у контролер.
Вона має доступ до об'єктів:
req(вхідний запит),res(відповідь),- і функції
next()- щоб передати виконання далі по ланцюжку.
Тобто middleware - це "фільтр" рівня HTTP, через який проходять усі (чи деякі) запити.
2. Сигнатура Middleware
У NestJS middleware можуть бути:
- Функцією, як в Express;
- Класом, що реалізує інтерфейс
NestMiddleware.
Приклад простого middleware-функціоналу:
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`${req.method} ${req.url}`);
next(); // обов'язково викликаємо next()
}3. Middleware-клас (рекомендований підхід)
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(`Request... ${req.method} ${req.url}`);
next();
}
}Клас-ін'єкція (@Injectable) дозволяє використовувати залежності,
наприклад сервіси (AuthService, ConfigService, Logger тощо).
4. Підключення middleware
Middleware не реєструється автоматично -
його потрібно вказати в модулі через метод configure().
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { UsersController } from './users.controller';
@Module({
controllers: [UsersController],
})
export class UsersModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware) // вказуємо middleware
.forRoutes(UsersController); // застосовуємо до конкретного контролера чи шляху
}
}5. Методи MiddlewareConsumer
| Метод | Опис |
|---|---|
.apply(...middlewares) | Вказати один чи кілька middleware |
.forRoutes(...routes) | Застосувати до маршрутів чи контролерів |
.exclude(...paths) | Виключити маршрути із застосування |
Приклад:
consumer
.apply(AuthMiddleware, LoggerMiddleware)
.exclude('auth/login', 'auth/register')
.forRoutes('users', 'orders');6. Де застосовують middleware в NestJS
| Сценарій | Приклад |
|---|---|
| Автентифікація / декодування токена | Перевірка JWT із заголовка |
| Логування запитів | Запис методу, URL, часу |
| Кешування | Перевірка/запис відповіді в Redis |
| Локалізація | Встановлення мови із заголовків |
| Rate limiting / IP-фільтрація | Захист API від спаму |
| Трасування / метрики | Надсилання даних у Prometheus, Sentry, Datadog |
7. Middleware vs Guards vs Interceptors
Ці три механізми схожі, але працюють на різних рівнях:
| Механізм | Рівень | Коли виконується | Використання |
|---|---|---|---|
| Middleware | HTTP (до Nest) | До контролера (рівень Express/HTTP) | Логування, токени, парсинг, CORS |
| Guards | Рівень Nest | Перед виконанням обробника маршруту | Перевірка прав, ролей, авторизація |
| Interceptors | Рівень Nest | До й після виклику обробника | Трансформація відповіді, тайминг, кешування |
Тобто:
- Middleware працює до того, як Nest потрапить у контролер;
- Guards/Interceptors - уже всередині контексту Nest (з метаданими, DI, декораторами тощо).
Підсумок
Middleware в NestJS - це функції чи класи, які виконуються до обробки запиту контролером, і дозволяють:
- логувати, змінювати, перевіряти чи відхиляти запити,
- додавати дані в
req,- чи виконувати інші задачі "до" Nest-пайплайну.
Основні факти:
- Реалізується через
NestMiddlewareчи просту функцію; - Підключається в модулі через
MiddlewareConsumer; - Працює до Guards, Interceptors і Pipes;
- Використовується для низькорівневої HTTP-логіки (а не бізнес-логіки).
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.