The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

19.10.2021 22:57

Состоялся релиз 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) {обработка результата});", при котором управление мгновенно перейдёт к дальнейшему коду, а результат запроса будет обработан по мере поступления данных.

  1. OpenNews: Уязвимость в http2-модуле из состава Node.js
  2. OpenNews: Выпуск серверной JavaScript-платформы Node.js 16.0
  3. OpenNews: Доступен пакетный менеджер NPM 7.0
  4. OpenNews: Уязвимость в NPM, приводящая к перезаписи файлов в системе
  5. OpenNews: Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/55997-node.js
Ключевые слова: node.js, javascript
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (41) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Аноним (2), 23:05, 19/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А давно нода позволяет юзать await на верхнем уровне?
     
     
  • 2.4, Ненавижу SJW (?), 23:25, 19/10/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Ну в JS эту фичу завезли не так уж и давно
     
     
  • 3.5, Ненавижу SJW (?), 23:26, 19/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Хотя наверное правильнее сказать в браузерные движки
     
  • 2.22, Шелмимо (?), 07:28, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Обзываем файл в виде name.mjs и получаем await на верхнем уровне.
     
     
  • 3.24, Шелмимо (?), 07:41, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Да, это все начиная с v14.
    В v12 еще нет такой фичи.
     
  • 3.36, Агент (?), 09:50, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ничего мы не получаем, получаем разве что файл статического импорта, .mjs-расширение которого вообще то формальность, и который ещё нужно импортировать. И какое отношение статические импорты/экспорты имеют к промисам/async/await?
     
     
  • 4.38, Шелмимо (?), 10:09, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    form@work:/tmp$ cat test.mjs
    const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

    console.log(new Date());
    await sleep(2000);
    console.log(new Date());
    form@work:/tmp$ node test.mjs
    2021-10-20T07:09:19.174Z
    2021-10-20T07:09:21.179Z
    form@work:/tmp$

     
     
  • 5.39, Агент (?), 10:14, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Вопрос был в чём? Предоставить .mjs-модуль и что? Должна была произойти магия, где сразу можно await использовать? С промисом и я могу.
     
     
  • 6.41, Шелмимо (?), 10:16, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Причем тут с промисом?
    await в принципе применим либо к промису либо к async функции.
    Речь о том, что await можно использовать в верхнем уровне без всяких async если файл - модуль.
     
     
  • 7.42, Шелмимо (?), 10:18, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Вот так, чтобы понятнее было что имеется в виду:

    form@work:/tmp$ node test.mjs
    2021-10-20T07:17:53.543Z
    2021-10-20T07:17:55.548Z
    form@work:/tmp$ mv test.mjs test.js
    form@work:/tmp$ node test.js
    /tmp/test.js:4
    await sleep(2000);
    ^^^^^

    SyntaxError: await is only valid in async functions and the top level bodies of modules
        at Object.compileFunction (node:vm:352:18)
        at wrapSafe (node:internal/modules/cjs/loader:1025:15)
        at Module._compile (node:internal/modules/cjs/loader:1059:27)
        at Object.Module._extensions..js (node:internal/modules/cjs/loader:1147:10)
        at Module.load (node:internal/modules/cjs/loader:975:32)
        at Function.Module._load (node:internal/modules/cjs/loader:822:12)
        at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
        at node:internal/main/run_main_module:17:47

    Node.js v17.0.0
    form@work:/tmp$

     
  • 7.56, Шпаньков (?), 14:05, 21/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    >await в принципе применим либо к промису либо к async функции.

    Нет. await применим к абсолютно любому значению. Это просто сахар над Thenable.

    await 123 // 123
    await null // null
    await {} // {}
    await { then(r) { r('hello') } } // 'hello'

     
  • 5.40, Шелмимо (?), 10:15, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Кстати нода сама подсказывает эту фичу: если попытаться использовать await за пределами async, он подскажет что await можно использовать так же в теле модуля.
     

  • 1.3, QwertyReg (ok), 23:23, 19/10/2021 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –12 +/
     

     ....ответы скрыты (4)

  • 1.7, Аноним (7), 23:27, 19/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А посоветуйте актуальной литературы? Ну там лучшие гайдлайны, популярные пакеты, всё вот это. В топе выдачи гугла ничего приличного нет. Лет 10 не трогал ноду.
     
     
  • 2.15, Аноним (15), 00:08, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    https://github.com/HowProgrammingWorks/Index/blob/master/Courses/NodeJS.md
     
     
  • 3.44, Аноним (7), 12:14, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Во-первых, это не литература. Текст гораздо проще воспринимать. Во-вторых, это ужасно. Ужасное качество записи, нет нормального микрофона, диктор мычит и толчёт воду в ступе, шокает и гыкает. Очень много времени тратит на совсем уж примитивные и очевидные вещи, повторяя их по несколько раз. Удручающе,
     

  • 1.8, Правильная вебмакака (?), 23:29, 19/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    А для меня нода умерла когда мс купил.
     
     
  • 2.31, Аноним (31), 08:41, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    ... мс купил npm. Но с другой стороны npm максимально ненужный трешняк, который сделал из здравой идеи полное УГ.
     
     
  • 3.34, пох. (?), 09:06, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    ну и пиши каждый раз новый лефтпад!
     

  • 1.10, YetAnotherOnanym (ok), 23:33, 19/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > FTP

    Ретрограды! Луддиты!

     
  • 1.18, Аноним (18), 01:09, 20/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Вот это днищенское дно... постоянные критические ошибки и уязвимости. В каждом выпуске. И конца и краю этому не видно.

    При том как я понимаю дело не в самом Node JS, а в убогом HTTP протоколе.

     
  • 1.19, Аноним (19), 01:48, 20/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Нельзя не восхититься всё-таки изяществом JS как языка с его прототипным ООП. Где ещё найдешь такое?
     
     
  • 2.20, Аноноша (?), 02:18, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > изяществом JS как языка с его прототипным ООП

    Настолько изящным, что раньше почти все писали свои обертки для создания классов и в ES2015 наконец-то завезли нормальный синтаксис для этого на уровне языка.

    > Где ещё найдешь такое?

    См. список тут https://en.wikipedia.org/wiki/Prototype-based_programming

     
  • 2.26, Наноним (?), 07:46, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Lua. Вообще Lua увернулся от "болезни С++", в отличие от ECMAScript. В Lua до версии 5.4 тащили только действительно нужные вещи. Единственная вещь, которой там реально не хватает - RAII, но её и в жабаскрипте нет.
    С Lua ситуация "в топку программирование, стану проституткой" не так вероятна, там язык очень простой и, главное, понятный, а не это "this может указывать на класс метода, а может не указывать", "у нас один оператор для конкатенации строк и сложения чисел". И рантайм не весит минимум 20 мегабайт, как у ноды
     
     
  • 3.28, Аноним (31), 08:37, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Из-за конструкций типа ~= Lua полностью и бесповоротно не нужен.
     
  • 3.29, n00by (ok), 08:39, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    RAII помимо захвата ресурса при инициализации подразумевает детерминированное освобождение, что затруднено при использовании сборки мусора.
     
  • 3.35, анон (?), 09:13, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Жаль только вакансий маловато, а которые есть Lua указан как второй язык
     
  • 3.49, DeadMustdie (??), 22:27, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ага.

    > там язык очень простой и, главное, понятный

    Особенно хорошо в Lua с числовыми типами (все целые пусть будут вещественными, так ведь гораздо удобнее!).
    А уж как там чудесно работа с Юникодом устроена - не пересказать!

     
     
  • 4.52, Аноноша (?), 00:09, 21/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Ага.
    >> там язык очень простой и, главное, понятный
    > Особенно хорошо в Lua с числовыми типами (все целые пусть будут вещественными,
    > так ведь гораздо удобнее!).
    > А уж как там чудесно работа с Юникодом устроена - не пересказать!

    https://www.lua.org/manual/5.3/readme.html#changes

    > Main changes
    >
    >    integers (64-bit by default)
    >    official support for 32-bit numbers
    >    bitwise operators
    >    basic utf-8 support

     
  • 3.53, Аноноша (?), 00:13, 21/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Единственная вещь, которой там реально не хватает - RAII, но её и в жабаскрипте нет.

    Его и не будет, т.к. сборка мусора недетерминированна. Для задач очистки ресурсов см.

    1. https://github.com/tc39/proposal-explicit-resource-management
    2. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objec

     

  • 1.23, kai3341 (ok), 07:33, 20/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    >  Выпуск серверной JavaScript-платформы Node.js 17.0

    ага, вот почему у меня билд фронта упал

     
     
  • 2.32, Аноним (32), 08:45, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Потому что кто-то скачивает каждый раз свежую node при каждом билде?
     
     
  • 3.48, kai3341 (ok), 21:40, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Потому что кто-то скачивает каждый раз свежую node при каждом билде?

    Потому, что CI проверяет актуальность docker image при каждом билде
    И нет, я был неправ. Свежая nodejs была не при делах

     

  • 1.30, ryoken (ok), 08:41, 20/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    Опять эта хрень час пересобираться будет... Какой осёл вообще додумался браузер на ней делать..?
     
     
  • 2.50, Аноним (50), 23:00, 20/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    А что плохого? Ну кроме С++ под капотом?
     
     
  • 3.55, ryoken (ok), 13:29, 21/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > А что плохого? Ну кроме С++ под капотом?

    Ну я ж говорю - пересобирается долго :D.

     

  • 1.54, Аноним (-), 09:42, 21/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    самый безопасный инструмент, миллионы самых быстрых программистов проверяют в продакшине
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру