Състоянието на релиза на Node.js 17.0, платформата за изпълнение на мрежови приложения на JavaScript, е реализирано. Node.js 17.0 попада в клона с обикновена поддръжка, на който обновления ще се издават до юни 2022 година. В близките дни ще бъде завършена стабилизацията на клона Node.js 16, който ще получи статус LTS и ще бъде поддържан до април 2024 година. Поддържането на предишната LTS версия Node.js 14.0 ще продължи до април 2023 година, а на по-предната LTS версия 12.0 до април 2022 година.
Основни подобрения:
- Двигателят V8 е обновен до версия 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();
- Доставената библиотека OpenSSL е обновена до версия 3.0 (използван е клон quictls/openssl с включена поддръжка на протокола QUIC).
- Осигурено е извеждането на версията на Node.js в стековите трасировки, които се генерират при фатални грешки, довеждащи до спиране на приложението.
Също така, можем да споменем, че в актуалните версии на Node.js са отстранени две уязвимости (CVE-2021-22959, CVE-2021-22960), които позволяват атаки от клас „HTTP Request Smuggling“ (HRS), давайки възможност на специално форматирани клиентски заявки да се вмъкнат в съдържанието на заявките на други потребители, обработвани в същия поток между фронтенда и бекенда (например, може да бъде постигнато вмъкване на злонамерен JavaScript код в сесията на друг потребител). Подробности ще бъдат разкрити по-късно, а засега е известно, че проблемите са причинени от неправилна обработка на пробелите между името на HTTP заглавката и двоеточието, а също и различна обработка на символите за нов ред и връщане на каретката в блока с параметри, използван при предаване на съдържанието на заявките на части в режим „chunked“.
Напомняме, че платформата Node.js може да се използва както за сървърно поддържане на Web приложения, така и за създаване на обикновени клиентски и сървърни мрежови програми. За разширяване на функционалността на приложенията за Node.js е подготвена голяма колекция от модули, в която могат да се намерят модули с реализирани сървъри и клиенти за HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, модули за интеграция с различни уеб фреймворкове, обработчици на WebSocket и Ajax, свързващи модули за СУБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонизатори, CSS движки, реализации на криптоалгоритми и системи за удостоверяване (OAuth), XML парсери.
За да се осигури обработката на голям брой паралелни заявки, Node.js използва асинхронен модел на изпълнение на кода, основан на обработка на събития в неблокиращ режим и определяне на колбек обработчици. Поддържат се методи за мултиплексиране на съединения като epoll, kqueue, /dev/poll и select. За мултиплексиране на съединения се използва библиотеката libuv, която е надстройка над libev в Unix-системи и над IOCP в Windows. За създаване на пул от нишки (thread pool) се използва библиотеката libeio, а за извършване на DNS запитвания в неблокиращ режим е интегриран c-ares. Всички системни повиквания, които предизвикват блокиране, се изпълняват в пул от нишки и след това, подобно на обработчиците на сигнали, предават резултата от своята работа обратно чрез неназован канал (pipe). Изпълнението на JavaScript код се осигурява чрез използване на разработения от Google двигател V8 (допълнително, Microsoft развива вариант на Node.js с двигателя Chakra-Core).
По същество, Node.js е подобен на фреймворците Perl AnyEvent, Ruby Event Machine, Python Twisted и реализацията на събития в Tcl, но цикълът на обработка на събития (event loop) в Node.js е скрит от разработчика и наподобява обработката на събития в уеб приложение, работещо в браузър. При написването на приложения за Node.js е необходимо да се вземе предвид спецификата на събитийно-ориентираното програмиране. Например, вместо да извършите „var result = db.query(„select..“);“ с изчакване за завършване и последваща обработка на резултатите, в Node.js се използва принципът на асинхронно изпълнение, т.е. кодът се трансформира в „db.query(„select..“, function (result) {обработка на резултата});“, при който управлението бързо преминава към следващия код, а резултатът от запитването се обработва по мярка на постъпването на данните.
Източник: opennet.ru
