Foi lançado o Node.js 17.0, uma plataforma para executar aplicações de rede em JavaScript. O Node.js 17.0 faz parte da linha com suporte regular, e as atualizações para ela serão lançadas até junho de 2022. Nos próximos dias, a estabilização da linha Node.js 16 será concluída, o que a tornará LTS e será suportada até abril de 2024. O suporte à linha anterior LTS, Node.js 14.0, continuará até abril de 2023, enquanto a linha LTS anterior, 12.0, será suportada até abril de 2022.
Principais melhorias:
- O motor V8 foi atualizado para a versão 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();
- A biblioteca OpenSSL incluída foi atualizada para a versão 3.0 (utilizando o fork quictls/openssl com suporte ao protocolo QUIC habilitado).
- Foi garantida a exibição da versão do Node.js em rastreamentos de pilha, mostrados em casos de erros fatais que levam ao encerramento da aplicação.
Adicionalmente, vale mencionar a correção de duas vulnerabilidades nas linhas atuais do Node.js (CVE-2021-22959, CVE-2021-22960), que permitem ataques da classe 'HTTP Request Smuggling' (HRS), possibilitando que requisições de clientes formatadas de maneira especial se intercalem com o conteúdo das requisições de outros usuários, processadas na mesma thread entre o frontend e o backend (por exemplo, pode-se conseguir a inserção de código JavaScript malicioso na sessão de outro usuário). Os detalhes serão divulgados posteriormente, mas, até agora, sabe-se que os problemas foram causados por um tratamento inadequado de espaços entre o nome do cabeçalho HTTP e os dois pontos, bem como o tratamento diferente de caracteres de retorno de carro e nova linha no bloco de parâmetros usado durante o envio do corpo da requisição em partes no modo 'chunked'.
Lembramos que a plataforma Node.js pode ser utilizada tanto para suporte ao servidor de aplicativos Web, quanto para a criação de programas de rede tanto clientes quanto servidores. Para expandir a funcionalidade dos aplicativos para Node.js, foi preparada uma grande coleção de módulos, onde é possível encontrar módulos com implementações. servidores e clientes HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, módulos para integração com diversos frameworks web, manipuladores WebSocket e Ajax, conectores a bancos de dados (MySQL, PostgreSQL, SQLite, MongoDB), motores de template, motores CSS, implementações de algoritmos de criptografia e sistemas de autorização (OAuth), parsers XML.
Para garantir o processamento de um grande número de solicitações paralelas, o Node.js utiliza um modelo assíncrono de execução de código, baseado em processamento de eventos em modo não bloqueante e determinação de manipuladores de callback. Como métodos de multiplexação de conexões, são suportados métodos como epoll, kqueue, /dev/poll e select. Para a multiplexação de conexões, usa-se a biblioteca libuv, que é uma camada de abstração sobre libev em sistemas Unix e sobre IOCP no Windows. Para criar um pool de threads, a biblioteca libeio é utilizada, e para a execução de consultas DNS de maneira não bloqueante, o c-ares foi integrado. Todas as chamadas de sistema que causam bloqueio são executadas dentro do pool de threads e, assim como os manipuladores de sinais, transmitem o resultado de seu trabalho de volta através de um canal não nomeado (pipe). A execução de código JavaScript é garantida pela utilização do mecanismo V8 desenvolvido pela Google (adicionalmente, a Microsoft desenvolve uma versão do Node.js com o mecanismo Chakra-Core).
Essencialmente, o Node.js é semelhante aos frameworks Perl AnyEvent, Ruby Event Machine, Python Twisted e à implementação de eventos em Tcl, mas o ciclo de processamento de eventos (event loop) no Node.js é oculto do desenvolvedor e se assemelha ao processamento de eventos em uma aplicação web que funciona em um navegador. Ao escrever aplicativos para Node.js, é necessário considerar a especificidade da programação orientada a eventos; por exemplo, em vez de executar "var result = db.query('select..');" aguardando a conclusão e posterior processamento dos resultados, no Node.js utiliza-se o princípio da execução assíncrona, ou seja, o código é transformado em "db.query('select..', function (result) { processar resultado });", onde o controle é imediatamente transferido para o restante do código, e o resultado da consulta será processado conforme os dados forem recebidos.
Fonte: opennet.ru
