Skip to main content

Що таке Middleware в NestJS?

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

Ці три механізми схожі, але працюють на різних рівнях:

МеханізмРівеньКоли виконуєтьсяВикористання
MiddlewareHTTP (до Nest)До контролера (рівень Express/HTTP)Логування, токени, парсинг, CORS
GuardsРівень NestПеред виконанням обробника маршрутуПеревірка прав, ролей, авторизація
InterceptorsРівень NestДо й після виклику обробникаТрансформація відповіді, тайминг, кешування

Тобто:

  • Middleware працює до того, як Nest потрапить у контролер;
  • Guards/Interceptors - уже всередині контексту Nest (з метаданими, DI, декораторами тощо).

Підсумок

Middleware в NestJS - це функції чи класи, які виконуються до обробки запиту контролером, і дозволяють:

  • логувати, змінювати, перевіряти чи відхиляти запити,
  • додавати дані в req,
  • чи виконувати інші задачі "до" Nest-пайплайну.

Основні факти:

  • Реалізується через NestMiddleware чи просту функцію;
  • Підключається в модулі через MiddlewareConsumer;
  • Працює до Guards, Interceptors і Pipes;
  • Використовується для низькорівневої HTTP-логіки (а не бізнес-логіки).

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.