Випуск серверної JavaScript-платформи Node.js 17.0

Відбувся реліз 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 * як readline від '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, модулі для інтеграції з різними web-фреймворками, обробники WebSocket та Aja , конектори до СУБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонізатори, CSS-движки, реалізації криптоалгоритмів та систем авторизації (OAuth), XML-парсери.

Для забезпечення обробки великої кількості паралельних запитів Node.js задіює асинхронну модель запуску коду, що базується на обробці подій у неблокувальному режимі та визначенні callback-обробників. Як способи мультиплексування з'єднань підтримуються такі методи, як 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 прихований від розробника та нагадує обробку подій у web-додатку, що працює у браузер. При написанні програм для node.js необхідно враховувати специфіку подієво-орієнтованого програмування, наприклад, замість виконання «var result = db.query(«select..»);» з очікуванням завершення роботи та подальшої обробки результатів, в Node.js використовує принцип асинхронного виконання, тобто. код трансформується в "db.query("select..", function (result) {обробка результату});", при якому керування миттєво перейде до подальшого коду, а результат запиту буде оброблений у міру надходження даних.

Джерело: opennet.ru

Додати коментар або відгук