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

Kate

Administrator
Команда форума
Состоялся релиз 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, модули для интеграции с различными web-фреймворками, обработчики WebSocket и Ajax, коннекторы к СУБД (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) {обработка результата});", при котором управление мгновенно перейдёт к дальнейшему коду, а результат запроса будет обработан по мере поступления данных.

 
Сверху