La version Node.js 17.0 a été publiée, une plateforme pour l'exécution d'applications réseau en JavaScript. Node.js 17.0 fait partie de la branche à support standard, avec des mises à jour prévues jusqu'en juin 2022. Dans les jours à venir, la stabilisation de la branche Node.js 16 sera terminée, cette dernière obtiendra le statut LTS et sera prise en charge jusqu'en avril 2024. Le support de l'ancienne branche LTS Node.js 14.0 se poursuivra jusqu'en avril 2023, tandis que l'avant-dernière branche LTS 12.0 sera maintenue jusqu'en avril 2022.
Améliorations principales :
- Le moteur V8 a été mis à jour vers la version 9.5.
- Продолжена реализация вариантов базового API, основанных на использовании интерфейса асинхронных вычислений Promise. В дополнение к ранее предложенным API Timers Promises и Streams Promises в Node.js 17.0 представлен API Readline Promise для построчного чтения данных с использованием модуля readline. import * as readline from ‘node:readline/promises’; import { stdin as input, stdout as output } from ‘process’; const rl = readline.createInterface({ input, output }); const answer = await rl.question(‘What do you think of Node.js?’); console.log(‘Thank you for your valuable feedback: ${answer}’); rl.close();
- La bibliothèque OpenSSL fournie a été mise à jour vers la version 3.0 (utilisant le fork quictls/openssl avec le support du protocole QUIC activé).
- La version de Node.js est maintenant affichée dans les traces de pile générées en cas d'erreurs fatales entraînant l'arrêt de l'application.
Il convient également de mentionner que deux vulnérabilités (CVE-2021-22959, CVE-2021-22960) ont été corrigées dans les branches actuelles de Node.js, permettant des attaques de type "HTTP Request Smuggling" (HRS), qui permettent, par l'envoi de requêtes client spécialement formatées, de s'immiscer dans le contenu des requêtes d'autres utilisateurs traitées dans le même flux entre le frontend et le backend (par exemple, cela peut permettre l'injection d'un code JavaScript malveillant dans la session d'un autre utilisateur). Les détails seront révélés ultérieurement, mais il est déjà connu que ces problèmes sont causés par un traitement incorrect des espaces entre le nom de l'en-tête HTTP et les deux-points, ainsi qu'un traitement différent des caractères de retour à la ligne et de saut de ligne dans le bloc de paramètres utilisé pour transmettre le corps de la requête en morceaux en mode "chunked".
Rappelons que la plateforme Node.js peut être utilisée tant pour le support serveur des applications Web que pour la création de programmes réseau classiques côté client et serveur. Pour étendre les fonctionnalités des applications Node.js, une vaste collection de modules a été préparée, dans laquelle on peut trouver des modules avec des implémentations serveurs et des clients HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, des modules pour l'intégration avec divers frameworks web, des gestionnaires WebSocket et Ajax, des connecteurs vers des SGBD (MySQL, PostgreSQL, SQLite, MongoDB), des moteurs de templates, des moteurs CSS, des implémentations d'algorithmes cryptographiques et des systèmes d'authentification (OAuth), des parseurs XML.
Pour traiter un grand nombre de requêtes simultanées, Node.js utilise un modèle d'exécution de code asynchrone basé sur le traitement d'événements en mode non-bloquant et la définition de gestionnaires de rappel (callback). Il prend en charge plusieurs méthodes de multiplexage de connexions, telles que epoll, kqueue, /dev/poll et select. La bibliothèque libuv est utilisée pour le multiplexage de connexions, qui est une couche au-dessus de libev dans les systèmes Unix et de IOCP sous Windows. La création d'un pool de threads est gérée par la bibliothèque libeio, tandis que c-ares est intégré pour exécuter des requêtes DNS en mode non-bloquant. Tous les appels système bloquants sont exécutés dans le pool de threads et, comme les gestionnaires de signaux, transmettent leurs résultats via un canal anonyme (pipe). L'exécution de code JavaScript est assurée par l'utilisation du moteur V8 développé par Google (Microsoft développe également une version de Node.js avec le moteur Chakra-Core).
En essence, Node.js ressemble aux frameworks Perl AnyEvent, Ruby Event Machine, Python Twisted et à l'implémentation des événements en Tcl, mais la boucle d'événements dans Node.js est cachée par le développeur et rappelle le traitement des événements dans une application web fonctionnant dans un navigateur. Lors de l'écriture d'applications pour Node.js, il est nécessaire de prendre en compte les particularités de la programmation orientée événements, par exemple, au lieu d'exécuter « var result = db.query('select..'); » en attendant la fin du traitement et le traitement des résultats, Node.js utilise le principe d'exécution asynchrone, c'est-à-dire que le code est transformé en « db.query('select..', function (result) { traitement du résultat }); », permettant un transfert immédiat de contrôle vers le code suivant, tandis que le résultat de la requête sera traité à mesure que les données arrivent.
Source : opennet.ru
