Voydevich
NestJS

Що нового в NestJS 12.2

Реліз NestJS 12.2 додає нові ліміти для SSE, WebSockets і валідації, змінює поведінку ValidationPipe та покращує зіставлення виключень у middleware.

Реліз від 19 жовтня 2026 · оновлено 9 листопада 2026

Головне

  • Нова опція maxPendingDataLength для декоратора @Sse
  • Параметр maxConcurrentMessages для IoAdapter та WsAdapter
  • Обмеження довжини повідомлень про помилки у ValidationPipe
  • Узгодження MiddlewareConsumer.exclude() з логікою роутера
  • Нові ліміти на розмір повідомлень у Kafka та таймаут з'єднання для TCP

Коротко

У релізі NestJS 12.2 з'явилися нові конфігураційні параметри для обмеження навантаження у потоках SSE, WebSocket-адаптерах, валідації та мікросервісах. Також оновлено низку стандартних налаштувань безпеки й парсингу даних, змінено логіку обробки помилок у ValidationPipe та вдосконалено алгоритми виключення маршрутів у middleware.

Нові можливості

Нові опції конфігурації

  • Обмеження буфера SSE: Декоратор @Sse({ maxPendingDataLength }) дозволяє задати кількість символів даних подій, що можуть очікувати клієнта, який не читає потік (за замовчуванням 4M; значення 0 або Infinity знімають обмеження).
  • Паралельні повідомлення у WebSockets: Класи IoAdapter та WsAdapter отримали параметр maxConcurrentMessages, що визначає кількість одночасно оброблюваних повідомлень клієнта (за замовчуванням 1000; Infinity знімає ліміт).
  • Ліміт помилок валідації: Для ValidationPipe додано прапорець maxErrorMessagesLength (за замовчуванням 1 000 000 символів); помилки понад цей ліміт замінюються записом «Further validation errors were omitted».
  • Ліміт розміру повідомлень Kafka: Додано параметр parser.maxMessageSize (за замовчуванням 16 MiB після розпакування); більші повідомлення логуються та пропускаються.
  • Таймаут очищення TCP: У TCP-сервері з'явився параметр drainTimeout (30 секунд за замовчуванням, 0 вимикає), що розриває з'єднання з клієнтом, який залишає відповіді непрочитаними.
  • Повторне підключення MQTT: Параметр reconnectOnConnackError для MQTT-сервера тепер увімкнено за замовчуванням, завдяки чому запит на підключення повторюється у разі відмови (для попередньої поведінки слід вказати false).
  • Хук зіставлення шляхів: Додано необов'язковий хук адаптера HttpServer.getRouteMatchingOptions(), який передає ядру інформацію про те, як роутер зіставляє шляхи.

Нові значення за замовчуванням та зміни в поведінці

  • Глибина вкладеності та ліміти масивів: У пакетах @nestjs/platform-express та @nestjs/platform-fastify параметри fieldNestingDepth і fieldArrayIndexLimit тепер за замовчуванням дорівнюють 32 та 1000 відповідно (встановлення в Infinity знімає ліміти).
  • Поведінка ValidationPipe:
    • Валідація за замовчуванням виконується з validationError.target: false, тому exceptionFactory, яка зчитує error.target, отримує undefined (для повернення старої поведінки потрібне значення true).
    • Передача масиву або примітиву замість очікуваного валідованого класу тепер повертає статус 400.
  • FileTypeValidator: Зіставлення рядкового значення fileType тепер виконується до кінця назви (наприклад, font/woff більше не приймає font/woff2; для таких випадків слід використовувати RegExp).
  • Обробка помилок:
    • BaseExceptionFilter відповідає стандартною фразою причини замість тексту повідомлення для помилок http-errors, створених з expose: false (за замовчуванням для статусів від 500).
    • Помилки StreamableFile повертають статус 400, але тіло відповіді більше не містить самого повідомлення про помилку.
  • Очищення завантажених файлів: Файли, завантажені із запитом, який був відхилений пайпом, тепер видаляються зі сховища.
  • Платформні адаптери:
    • У @nestjs/platform-fastify маршрут з fileSize: undefined (або null) використовує ліміт плагіна; Infinity залишає завантаження необмеженими.
    • У @nestjs/platform-express об'єкти помилок надсилаються як application/json на маршрутах із типом Content-Type, відмінним від JSON.
  • Логування та DI:
    • ConsoleLogger у режимі JSON обрізає запис, якщо його довжина перевищує приблизно мільйон символів.
    • Глобальний енхансер, який інжектор не зміг ініціалізувати, тепер зупиняє запуск застосунку з помилкою.
    • Для APP_FILTER зі scope Request або Transient під час запуску виводиться попередження, оскільки такий фільтр застосовується лише до винятків із контролерів.
  • Мікросервіси та Kafka:
    • Ключ патерну довший за 256 символів більше не збігається з жодним обробником.
    • Повідомлення Kafka тепер можуть містити до 10 000 значень заголовків; заголовки, передані як рядок чи масив, не надсилаються; заголовки відповідей декодуються як текст.
    • У gRPC вхідні потоки запитів призупиняються, доки очікується запис відповідей на них.
  • Застаріла функціональність (Deprecation): На транспортах TCP, Redis, NATS, MQTT та RabbitMQ обробник @EventPattern(), який відповідає на виклик ClientProxy#send(), тепер логує попередження про застарілий підхід (у наступній мажорній версії обробники подій перестануть відповідати на send()).

Виключення в Middleware

  • Метод MiddlewareConsumer.exclude() тепер компілює виключені маршрути з урахуванням налаштувань роутера щодо регістру та завершального слеша (потрібне спільне оновлення @nestjs/core та адаптерів @nestjs/platform-express / @nestjs/platform-fastify).
  • У разі використання версіонування через заголовки, media type або кастомні правила, exclude({ path, method, version }) та enableCsrfProtection({ exclude }) діють лише на запити, які запитують одну з виключених версій.
  • У @nestjs/platform-fastify хук запиту для enableCsrfProtection() та useSecurityHeaders() тепер виконується перед Nest і middleware app.use() також під час виклику NestFactory.create().

Виправлення та покращення

  • Fastify: Заголовки безпеки додаються до відповідей роутера з помилками, виправлено очищення залишків файлів у пам'яті після буферизації та передачу помилок екстрактора версій до обробника помилок.
  • Мікросервіси:
    • Запобігання блокуванню TCP-відповідей у клієнті під час backpressure та зупинка відправки відповідей Observable, якщо клієнт відключився.
    • Виправлено зіставлення пустих рівнів топіків MQTT і додано відхилення топіків довжиною понад 65535 байт.
    • У RabbitMQ додано закриття каналу перед закриттям з'єднання та відновлення споживання після скасування consumer.
    • Для NATS та генерації ID запитів тепер використовуються непередбачувані ідентифікатори.
  • Ядро (Core):
    • Підтримка запуску класів перехоплювачів, пайпів, фільтрів та гардів, зареєстрованих без імені.
    • Виявлення циклічних залежностей у request-scoped forward references.
    • Коректне монтування middleware для контролерів під час використання префіксів, версіонування та модулів, що наслідують інші модулі.
    • Приховування внутрішніх повідомлень про помилки у подіях SSE та коректне передавання помилок заголовків SSE до фільтрів винятків.

Огляд підготовлено автоматично за офіційними release notes за допомогою ШІ та перевірено на відповідність джерелу. Точні формулювання дивіться в оригіналі. Як ми працюємо