Foi lançado o Node.js 17.0, uma plataforma para execução de aplicativos de rede em JavaScript. Node.js 17.0 é um branch de suporte regular que continuará recebendo atualizações até junho de 2022. Nos próximos dias será concluída a estabilização da filial Node.js 16, que receberá o status LTS e terá suporte até abril de 2024. A manutenção da ramificação LTS anterior do Node.js 14.0 durará até abril de 2023, e do penúltimo ramo LTS 12.0 até abril de 2022.
Principais melhorias:
- O motor V8 foi atualizado para a versão 9.5.
- A implementação de variantes da API básica baseada no uso da interface de computação assíncrona Promise continuou. Além das APIs Timers Promises e Streams Promises oferecidas anteriormente, o Node.js 17.0 introduz a API Readline Promise para leitura de dados linha por linha usando o módulo readline. importar * como readline de 'node:readline/promises'; importar {stdin como entrada, stdout como saída} de 'processo'; const rl = readline.createInterface({ entrada, saída }); const resposta = aguardar rl.question('O que você acha do Node.js?'); console.log('Obrigado pelo seu valioso feedback: ${answer}'); rl.close();
- A biblioteca OpenSSL fornecida foi atualizada para a versão 3.0 (é usado um fork quictls/openssl com suporte ao protocolo QUIC habilitado).
- Habilitou a exibição da versão do Node.js em rastreamentos de pilha gerados em caso de erros fatais que causam o encerramento do aplicativo.
Adicionalmente, podemos citar a eliminação de duas vulnerabilidades nas atuais ramificações do Node.js (CVE-2021-22959, CVE-2021-22960), que possibilitam a realização de ataques de “HTTP Request Smuggling” (HRS), que nos permitem acessar o conteúdo das solicitações de outros usuários processadas no mesmo thread entre o front-end e o back-end (por exemplo, código JavaScript malicioso pode ser inserido na sessão de outro usuário). Os detalhes serão revelados posteriormente, mas por enquanto sabemos apenas que os problemas são causados pelo tratamento incorreto de espaços entre o nome do cabeçalho HTTP e os dois pontos, bem como pelo tratamento diferente de caracteres de retorno de carro e avanço de linha no bloco de parâmetros usado durante a transmissão. o corpo da solicitação em partes no modo “fragmentado” "
Lembre-se de que a plataforma Node.js pode ser usada tanto para suporte de aplicativos da Web no lado do servidor quanto para a criação de programas comuns de rede de clientes e servidores. Para ampliar a funcionalidade das aplicações para Node.js, foi preparado um grande acervo de módulos, onde você encontra módulos com implementação de servidores e clientes HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, módulos para integração com diversos frameworks web, manipuladores WebSocket e Ajax, conectores para SGBD (MySQL, PostgreSQL, SQLite, MongoDB), motores de templates, motores CSS, implementações de algoritmos criptográficos e sistemas de autorização (OAuth), analisadores XML.
Para lidar com um grande número de solicitações paralelas, o Node.js usa um modelo de execução de código assíncrono baseado no processamento de eventos sem bloqueio e na definição de manipuladores de retorno de chamada. Os métodos suportados para conexões de multiplexação incluem epoll, kqueue, /dev/poll e select. Para multiplexação de conexões, é utilizada a biblioteca libuv, que é um complemento da libev em sistemas Unix e do IOCP no Windows. A biblioteca libeio é usada para criar um pool de threads e c-ares é integrado para realizar consultas DNS em modo sem bloqueio. Todas as chamadas do sistema que causam bloqueio são executadas dentro do pool de threads e então, como manipuladores de sinal, passam o resultado de seu trabalho de volta por meio de um canal sem nome. A execução do código JavaScript é garantida através da utilização do motor V8 desenvolvido pelo Google (além disso, a Microsoft está desenvolvendo uma versão do Node.js com o motor Chakra-Core).
Em sua essência, o Node.js é semelhante aos frameworks Perl AnyEvent, Ruby Event Machine, Python Twisted e à implementação de eventos em Tcl, mas o loop de eventos no Node.js está oculto do desenvolvedor e se assemelha ao processamento de eventos em um aplicativo da web rodando no navegador. Ao escrever aplicativos para node.js, é necessário levar em consideração as especificidades da programação orientada a eventos, por exemplo, em vez de fazer “var result = db.query(“select..”);” com a espera pela conclusão do trabalho e posterior processamento dos resultados, o Node.js utiliza o princípio da execução assíncrona, ou seja, o código é transformado em “db.query(“select..”, function (result) {processamento de resultado});”, no qual o controle passará imediatamente para outro código, e o resultado da consulta será processado conforme os dados chegam.
Fonte: opennet.ru