Voydevich
Express

Що нового в Express 5.3

Реліз приніс умовну ревалідацію для методу QUERY, оновлення парсингу заголовків і виправлення вразливостей у залежностях.

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

Головне

  • Підтримка перевірки свіжості req.fresh та відповідей 304 для методу QUERY
  • res.send тепер запобігає конфлікту між Content-Length та Transfer-Encoding
  • Оновлення content-type до ^2.0.0 з прискореним парсингом у res.send()
  • Виправлено вразливості безпеки через оновлення qs, proxy-addr та body-parser
  • Логування повного об'єкта помилки за замовчуванням замість лише stack trace

Коротко

У релізі Express 5.3 додано підтримку умовної ревалідації кешу для HTTP-методу QUERY та розширено логування вбудованого обробника помилок. Також оновлено низку ключових залежностей для усунення вразливостей і оптимізовано роботу із заголовками Content-Type, Content-Length та Content-Disposition.

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

Підтримка методу QUERY в req.fresh

Раніше перевірка свіжості req.fresh виконувалася лише для запитів GET та HEAD, через що відповіді на метод QUERY ніколи не повертали статус 304 Not Modified, навіть за наявності відповідного валідатора. Оскільки QUERY є безпечним, ідемпотентним і кешованим методом із підтримкою умовних запитів, його додано до перевірки свіжості:

// QUERY /reports with If-None-Match: "12345"
app.query('/reports', (req, res) => {
  res.set('ETag', '"12345"');
  res.send(results); // тепер відповідає 304 Not Modified
});

Покращене логування в стандартному error handler

Стандартний обробник помилок тепер логує повний об'єкт помилки, а не лише її stack trace. Завдяки цьому в логах зберігаються вкладені деталі (наприклад, Error.cause) та специфічні властивості сторонніх бібліотек на кшталт parent або original у Sequelize.

Зміни в обробці Content-Type

Пакет content-type оновлено до версії ^2.0.0 (разом з type-is до ^2.1.0), що забезпечує приблизно в 1.5 раза швидший парсинг і форматування Content-Type у res.send(). Метод res.send() тепер зберігає наявні параметри під час додавання charset і більше не викидає помилку, якщо Content-Type не вдається розпарсити:

res.set('Content-Type', 'text/plain; foo=bar').send('hey');
// -> Content-Type: text/plain; foo=bar; charset=utf-8

Також реалізовано оптимізацію: усунуто подвійну обробку заголовка Content-Type у res.send() під час надсилання рядкових відповідей без явно заданого заголовка.

Оновлення Content-Disposition

Залежність content-disposition оновлено до версії ^2.0.1. У методах res.download(), res.attachment() та res.sendFile() назви файлів, які є валідними HTTP-токенами, більше не огортаються в лапки:

res.attachment('user.html');
// раніше -> Content-Disposition: attachment; filename="user.html"
// тепер   -> Content-Disposition: attachment; filename=user.html

Обробка null в app.render

Під час виклику app.render зі значенням опцій null об'єкт locals тепер обробляється коректно без неочікуваних помилок. Поведінка методу стала такою ж, як і при опущенні аргументу опцій або передачі порожнього об'єкта:

app.render('index', null, callback);

Структура HTML у res.redirect()

Для відповідей res.redirect(), коли клієнт приймає HTML-формат, додано теги <!DOCTYPE html>, <title> та <body> для кращої сумісності з браузерами.

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

  • Усунення конфлікту заголовків у res.send(): виправлено поведінку для запобігання конфліктам між заголовками Content-Length та Transfer-Encoding. Заголовок Content-Length додається лише тоді, коли Transfer-Encoding відсутній. Генерація ETag за наявності Transfer-Encoding зберігається.
  • Оновлення body-parser до ^2.3.0: виправлено CVE-2026-12590 (GHSA-v422-hmwv-36x6). Раніше некоректне значення опції limit призводило до тихого вимкнення контролю розміру тіла запиту; тепер некоректні значення limit викидають помилку під час ініціалізації парсера.
  • Оновлення qs до ^6.16.0: виправлено CVE-2026-2391 (GHSA-w7fw-mjwx-w883), CVE-2026-82417 (GHSA-4mjr-xmp4-gh2g) та CVE-2026-82562 (GHSA-x5fp-wj9c-mxmx), пов'язані з обходом arrayLimit при парсингу ком та відмовою в обслуговуванні через контрольований зловмисником isBuffer.
  • Оновлення proxy-addr до ^2.0.8: закрито вразливість CVE-2026-90711.
  • Покращення методу req.acceptsCharsets: оптимізовано роботу методу обробки кодувань.
  • Заміна застарілого методу: застарілий trimRight() у кодовій базі замінено на trimEnd().

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