Wersja serwera JavaScript Node.js 17.0

Ukazała się Node.js 17.0, platforma do uruchamiania aplikacji sieciowych w języku JavaScript. Node.js 17.0 to zwykła gałąź wsparcia, która będzie otrzymywać aktualizacje do czerwca 2022 r. W najbliższych dniach zakończy się stabilizacja gałęzi Node.js 16, która otrzyma status LTS i będzie wspierana do kwietnia 2024 roku. Utrzymanie dotychczasowej gałęzi LTS Node.js 14.0 potrwa do kwietnia 2023, a rok wcześniej ostatniej gałęzi LTS 12.0 do kwietnia 2022.

Główne ulepszenia:

  • Silnik V8 został zaktualizowany do wersji 9.5.
  • Kontynuowano wdrażanie wariantów podstawowego API w oparciu o wykorzystanie asynchronicznego interfejsu obliczeniowego Promise. Oprócz oferowanych wcześniej interfejsów API Timers Promises i Streams Promises, w Node.js 17.0 wprowadzono interfejs API Readline Promise do odczytu danych linia po linii za pomocą modułu readline. importuj * jako linię readline z „węzła:readline/promises”; import {stdin jako wejście, stdout jako wyjście} z „procesu”; const rl = readline.createInterface({ wejście, wyjście }); const odpowiedź = oczekuj rl.question('Co sądzisz o Node.js?'); console.log('Dziękujemy za cenne uwagi: ${answer}'); rl.zamknij();
  • Dostarczona biblioteka OpenSSL została zaktualizowana do wersji 3.0 (używany jest fork quictls/openssl z włączoną obsługą protokołu QUIC).
  • Włączono wyświetlanie wersji Node.js w śladach stosu, które są generowane w przypadku błędów krytycznych powodujących zakończenie działania aplikacji.

Dodatkowo możemy wspomnieć o wyeliminowaniu dwóch luk w obecnych gałęziach Node.js (CVE-2021-22959, CVE-2021-22960), które umożliwiają przeprowadzanie ataków „HTTP Request Smuggling” (HRS), które pozwalają nam wklinować się w treść żądań innych użytkowników przetwarzanych w tym samym wątku pomiędzy frontendem a backendem (np. złośliwy kod JavaScript może zostać wstawiony do sesji innego użytkownika). Szczegóły zostaną ujawnione później, ale na razie wiemy tylko, że przyczyną problemów jest nieprawidłowa obsługa spacji pomiędzy nazwą nagłówka HTTP a dwukropkiem, a także odmienna obsługa znaków powrotu karetki i znaku nowego wiersza w bloku parametrów używanym podczas transmisji treść żądania w częściach w trybie „pofragmentowanym” „

Przypomnijmy, że platformę Node.js można wykorzystać zarówno do obsługi aplikacji webowych po stronie serwera, jak i do tworzenia zwykłych programów sieciowych klienckich i serwerowych. Aby rozszerzyć funkcjonalność aplikacji dla Node.js przygotowano duży zbiór modułów, w którym można znaleźć moduły z implementacją serwerów i klientów HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduły do ​​integracji z różnymi frameworkami sieciowymi, handlerami WebSocket i Ajax, konektorami do DBMS (MySQL, PostgreSQL, SQLite, MongoDB), silnikami szablonów, silnikami CSS, implementacjami algorytmów kryptograficznych i systemów autoryzacji (OAuth), parserami XML.

Aby zapewnić przetwarzanie dużej liczby równoległych żądań, Node.js wykorzystuje asynchroniczny model wykonywania kodu oparty na nieblokującej obsłudze zdarzeń i definicji procedur obsługi wywołań zwrotnych. Obsługiwane metody multipleksowania połączeń to epoll, kqueue, /dev/poll i select. Do multipleksowania połączeń używana jest biblioteka libuv, która jest dodatkiem do libev w systemach Unix i IOCP w Windows. Biblioteka libeio służy do tworzenia puli wątków, a c-ares jest zintegrowany do wykonywania zapytań DNS w trybie nieblokującym. Wszystkie wywołania systemowe, które powodują blokowanie, są wykonywane wewnątrz puli wątków, a następnie, podobnie jak procedury obsługi sygnałów, przekazują wynik swojej pracy z powrotem przez nienazwany potok (pipe). Wykonanie kodu JavaScript zapewnia wykorzystanie silnika V8 opracowanego przez Google (dodatkowo Microsoft rozwija wersję Node.js z silnikiem Chakra-Core).

W swej istocie Node.js jest podobny do platform Perl AnyEvent, Ruby Event Machine, Python Twisted i implementacji zdarzeń Tcl, ale pętla zdarzeń w Node.js jest ukryta przed programistą i przypomina obsługę zdarzeń w działającej aplikacji internetowej w przeglądarce. Pisząc aplikacje dla node.js, musisz wziąć pod uwagę specyfikę programowania sterowanego zdarzeniami, na przykład zamiast robić „var result = db.query("select..");" z oczekiwaniem na zakończenie pracy i późniejszym przetwarzaniem wyników Node.js wykorzystuje zasadę wykonania asynchronicznego, tj. kod jest przekształcany na "db.query("select..", function (result) {result processing});", w którym sterowanie natychmiast przejdzie do dalszego kodu, a wynik zapytania zostanie przetworzony w miarę napływu danych.

Źródło: opennet.ru

Dodaj komentarz