Bol sa vydaný Node.js 17.0, platforma na spúšťanie sieťových aplikácií v programovacom jazyku JavaScript. Node.js 17.0 patrí do vetvy s bežnou dobou podpory, aktualizácie pre ktorú budú vydávané do júna 2022. V priebehu niekoľkých dní sa dokončí stabilizácia vetvy Node.js 16, ktorá získa status LTS a bude podporovaná do apríla 2024. Podpora predchádzajúcej LTS vetvy Node.js 14.0 potrvá do apríla 2023, a pre predpredchádzajúcu LTS vetvu 12.0 potrvá do apríla 2022.
Hlavné vylepšenia:
- Motor V8 bol aktualizovaný na verziu 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();
- Dodaný balík OpenSSL bol aktualizovaný na verziu 3.0 (použitý fork quictls/openssl s podporou protokolu QUIC).
- Zabezpečené zobrazovanie verzie Node.js v trasovaniach zásobníka v prípade fatálnych chýb, ktoré vedú k ukončeniu aplikácie.
Ďalej môžeme spomenúť odstránenie dvoch zraniteľností (CVE-2021-22959, CVE-2021-22960) v aktuálnych vetvách Node.js, ktoré umožňujú útoky typu "HTTP Request Smuggling" (HRS), ktoré umožňujú prostredníctvom zasielania špeciálne upravených klientskych požiadaviek zasahovať do obsahu požiadaviek iných používateľov spracovávaných v tej istej vetve medzi frontendom a backendom (napríklad sa môže docieliť vloženie škodlivého JavaScriptového kódu do relácie iného používateľa). Podrobnosti budú zverejnené neskôr, zatiaľ je známe iba to, že problémy sú spôsobené nesprávnym spracovaním medzier medzi názvom HTTP hlavičky a dvojbodkou, ako aj rôznymi spôsobmi spracovania znakov návratu vozíka a návratu riadka v bloku parametrov používanom pri prenose tela požiadavky po častiach v režime "chunked".
Pripomíname, že platformu Node.js je možné využiť ako na serverové sprevádzanie práce webových aplikácií, tak aj na tvorbu bežných klientských a serverových sieťových programov. Pre rozšírenie funkčnosti aplikácií pre Node.js je pripravená rozsiahla zbierka modulov, ktorá obsahuje moduly s implementáciou serverov a klientov HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduly na integráciu s rôznymi webovými rámcami, spracovateľov WebSocket a Ajax, konektorov k DBMS (MySQL, PostgreSQL, SQLite, MongoDB), šablónovačov, CSS enginov, implementácií kryptografických algoritmov a systémov autorizácie (OAuth), XML parserov.
Na zabezpečenie spracovania veľkého počtu paralelných dopytov využíva Node.js asynchrónny model spúšťania kódu, založený na spracovaní udalostí v neblokujúcom režime a určovaní callback spracovateľov. Ako metódy multiplexovania pripojení podporujú také metódy, ako sú epoll, kqueue, /dev/poll a select. Na multiplexovanie pripojení sa používa knižnica libuv, ktorá je nadstavbou nad libev na systémoch Unix a nad IOCP na Windows. Na vytvorenie poolu vlákien (thread pool) je zapojená knižnica libeio, na vykonávanie DNS dopytov v neblokujúcom režime je integrovaný c-ares. Všetky systémové volania, ktoré spôsobujú blokovanie, sa vykonávajú vnútri poolu vlákien a potom, rovnako ako spracovatelia signálov, prenášajú výsledok svojej práce späť cez anonymný kanál (pipe). Vykonávanie JavaScript kódu je zabezpečené zapojením vyvinutého engine V8 spoločnosťou Google (ďalej Microsoft vyvíja variant Node.js s engine Chakra-Core).
V podstate je Node.js podobný rámcom Perl AnyEvent, Ruby Event Machine, Python Twisted a realizácii udalostí v Tcl, ale cyklus spracovania udalostí (event loop) v Node.js je skrytý pred vývojárom a pripomína spracovanie udalostí vo webovej aplikácii, ktorá beží v prehliadači. Pri písaní aplikácií pre Node.js je potrebné zohľadniť špecifiku udalostne orientovaného programovania, napríklad, namiesto vykonávania „var result = db.query(„select..“);“ s očakávaním dokončenia práce a následným spracovaním výsledkov, v Node.js sa používa princíp asynchrónneho vykonávania, t.j. kód sa transformuje na „db.query(„select..“, function (result) {spracovanie výsledku});“, pri ktorom sa riadenie okamžite presunie na ďalší kód a výsledok dopytu bude spracovaný, akonáhle sa údaje dostanú.
Zdroj: opennet.ru
