Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке Middleware в NestJS?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Middleware - функція чи клас, що виконується до того, як запит потрапить у контролер: має доступ до `req`, `res` і `next()`; у NestJS реалізується як функція (як в Express) чи клас з інтерфейсом `NestMiddleware`, підключається в модулі через `configure()`/`MiddlewareConsumer`, а не автоматично. **Ключове:** middleware працює на рівні HTTP до того, як Nest потрапить у контролер (логування, токени, CORS), тоді як Guards і Interceptors працюють уже всередині Nest-контексту (з метаданими, DI, декораторами) - до й після виклику обробника відповідно.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Що таке Middleware в NestJS > **Middleware** - це функція (чи клас), > яка **виконується до того, як запит потрапить у контролер**. Вона має доступ до об'єктів: - `req` (вхідний запит), - `res` (відповідь), - і функції `next()` - щоб передати виконання далі по ланцюжку. Тобто middleware - це **"фільтр" рівня HTTP**, через який проходять усі (чи деякі) запити. ## 2. Сигнатура Middleware У NestJS middleware можуть бути: 1. **Функцією**, як в Express; 2. **Класом**, що реалізує інтерфейс `NestMiddleware`. Приклад простого middleware-функціоналу: ```javascript 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-клас (рекомендований підхід) ```javascript 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()`. ```javascript 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)` | Виключити маршрути із застосування | Приклад: ```javascript 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-логіки** (а не бізнес-логіки).Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.