veilletech.fr
10 nov. Feed du jour
#07 NODE Article

Node 27 : keepAlive à 65 s, headers sans prototype

Un en-tête sans prototype, et un hasOwnProperty qui plante.

L'alpha de Node.js 27 change deux défauts du serveur HTTP : keepAliveTimeout passe de 5 à 65 secondes, et req.headers n'a plus de prototype, si bien que req.headers.hasOwnProperty(...) lève une TypeError. Le second est une rupture à chercher dans le code ; le premier explique une cause classique de 502 intermittents derrière un ALB, corrigeable dès aujourd'hui.

2 min de lectureintermédiairevidéo 1:19
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. 1. keepAliveTimeout : de 5 à 65 secondes
  3. 2. req.headers et req.trailers n'ont plus de prototype
  4. Comment s'y prendre
  5. À retenir

Ce qui se passe

Le 29 octobre 2026, l'équipe Node.js a publié v27.0.0-alpha.0.0.0, première version du nouveau calendrier annuel : une phase alpha de six mois, la version Current en avril 2027 et le passage en LTS en octobre 2027. La fiche du 6 novembre traitait de V8 et de la sérialisation ; deux changements du serveur HTTP restent à voir.

1. keepAliveTimeout : de 5 à 65 secondes

http.Server fermait une connexion inactive au bout de 5 s. Or un répartiteur de charge garde souvent la sienne plus longtemps : le délai d'inactivité par défaut d'un AWS ALB est de 60 s. Si Node ferme le socket au moment où le proxy le réutilise, la requête échoue en 502 Bad Gateway, de façon intermittente et difficile à reproduire. Le nouveau défaut de 65 000 ms dépasse ces 60 s. La temporisation réelle du socket ajoute keepAliveTimeoutBuffer, 1 s par défaut.

65 s ne couvrent pas toutes les configurations. Regardez le délai d'inactivité réel de votre proxy (Nginx, Cloudflare, ALB) et réglez le vôtre au-dessus. Cela marche aujourd'hui, sur n'importe quelle version :

JavaScript
server.keepAliveTimeout = 65_000; // > délai d'inactivité du proxy

2. req.headers et req.trailers n'ont plus de prototype

Les dictionnaires d'en-têtes des requêtes entrantes héritent de null au lieu d'Object.prototype, comme le faisaient déjà headersDistinct et trailersDistinct. Les noms d'en-têtes sont choisis par l'émetteur de la requête : un client peut envoyer un en-tête constructor ou __proto__, qui arrive tel quel sous cette clé. Le changement vient de la PR #62900 de Matteo Collina, dont le message parle de pollution de prototype. Le précédent est réel : CVE-2026-21710, corrigée dans les versions de sécurité de mars 2026, pouvait faire planter le processus quand une requête avec un en-tête __proto__ touchait req.headersDistinct.

La lecture, la déstructuration et Object.keys() ne changent pas. Ce qui casse, c'est l'appel d'une méthode héritée :

JavaScript
req.headers.hasOwnProperty('authorization');  // Node 27 : TypeError
Object.hasOwn(req.headers, 'authorization');  // marche en Node 26 comme en 27

L'opérateur in fonctionne encore, mais la documentation déconseille de s'en servir ici. Ne restaurez pas Object.prototype sur l'objet pour « réparer » : c'est exactement ce que la rupture voulait éviter.

Comment s'y prendre

  1. grep -rn "headers.hasOwnProperty" src/ et remplacez par Object.hasOwn(req.headers, '…').
  2. Fixez keepAliveTimeout explicitement au-dessus du délai de votre proxy.
  3. Ajoutez Node 27 alpha à votre CI, en tâche non bloquante : l'alpha sert à repérer ces ruptures avant la version Current. Gardez une LTS en production au moins jusqu'en avril 2027.

Source : Node.js Design Patterns, en anglais, qui renvoie à la PR #62900 et aux versions de sécurité de mars 2026.