"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Fluxos Node.js: o que, por que e como usá-los

Fluxos Node.js: o que, por que e como usá-los

Publicado em 13/11/2024
Navegar:523

Node.js Streams: What, Why, and How to Use Them

O manuseio eficiente de grandes dados é crucial em aplicativos da web modernos. Os métodos tradicionais que carregam um arquivo inteiro na memória não são ideais para processar grandes quantidades de dados. É aqui que Streams em Node.js são úteis. Eles permitem processar dados peça por peça (em partes), melhorando o desempenho, reduzindo o uso de memória e aumentando a eficiência. Neste artigo, exploraremos o que são streams, por que são importantes e como usá-los de maneira eficaz em Node.js.

Neste artigo, abordaremos:

  1. O que são fluxos em Node.js?
  2. Tipos de fluxos.
  3. Por que usar streams?
  4. Leitura de dados com fluxos legíveis.
  5. Gravando dados com fluxos graváveis.
  6. Piping Streams Juntos.
  7. Casos práticos de uso de streams.
  8. Tratamento de erros em streams.

O que são fluxos em Node.js?

Um Stream em Node.js é uma sequência de dados que é lida ou gravada ao longo do tempo. Em vez de esperar que todos os dados estejam disponíveis, os fluxos permitem processá-los à medida que são gerados. Isso significa que você pode começar a manipular dados antes mesmo de todo o arquivo ou solicitação estar totalmente disponível.

Streams funcionam bem para:

  • Leitura de arquivos grandes.
  • Streaming de dados de vídeo ou áudio.
  • Tratamento de solicitações e respostas HTTP.

Tipos de fluxos

Existem quatro tipos principais de streams no Node.js:

  1. Streams legíveis: esses streams permitem que você leia dados, por exemplo, lendo de um arquivo ou soquete de rede.
  2. Streams graváveis: permitem gravar dados, como gravar em um arquivo ou enviar dados por uma rede.
  3. Fluxos duplex: são legíveis e graváveis, o que significa que você pode ler e gravar dados no mesmo fluxo (por exemplo, soquetes TCP).
  4. Transform Streams: Esses streams permitem que você modifique ou transforme os dados à medida que eles passam, como compactar ou criptografar dados.

Por que usar fluxos?

Ao lidar com grandes volumes de dados ou fontes de dados contínuas, os fluxos oferecem diversas vantagens:

  • Uso eficiente de memória: Os fluxos processam dados em partes, para que não carreguem os dados inteiros na memória, tornando-os eficientes em termos de memória.
  • Processamento mais rápido: você pode começar a processar os dados assim que eles chegam, em vez de esperar o carregamento de todo o conjunto de dados.
  • Não bloqueador: Os fluxos Node.js não são bloqueadores, o que significa que eles não bloqueiam outras operações durante a leitura ou gravação de dados.

Isso é particularmente útil para cenários como leitura/gravação de arquivos, solicitações HTTP e fornecimento de conteúdo multimídia.

Lendo dados com fluxos legíveis

Vejamos como ler dados de um arquivo usando um Readable Stream.

Exemplo: lendo um arquivo usando um fluxo legível

const fs = require('fs');

// Create a readable stream from a file
const readableStream = fs.createReadStream('input.txt', { encoding: 'utf8' });

// Handle 'data' event to read chunks of data
readableStream.on('data', (chunk) => {
    console.log('Received chunk:', chunk);
});

// Handle 'end' event when all data has been read
readableStream.on('end', () => {
    console.log('No more data.');
});

// Handle 'error' event in case of an error
readableStream.on('error', (err) => {
    console.error('An error occurred:', err.message);
});

Neste exemplo:

  • Criamos um fluxo legível a partir de um arquivo chamado input.txt.
  • O evento 'data' é acionado quando um pedaço de dados está disponível.
  • O evento 'end' é acionado quando não há mais dados para ler.

Gravando dados com fluxos graváveis

Agora, vamos ver como gravar dados em um arquivo usando um Writable Stream.

Exemplo: Gravando dados em um arquivo usando um fluxo gravável

const fs = require('fs');

// Create a writable stream to a file
const writableStream = fs.createWriteStream('output.txt');

// Write some data to the file
writableStream.write('Hello, World!\n');
writableStream.write('This is a writable stream example.\n');

// End the stream and close the file
writableStream.end();

// Handle 'finish' event when writing is complete
writableStream.on('finish', () => {
    console.log('Writing to file completed.');
});

// Handle 'error' event in case of an error
writableStream.on('error', (err) => {
    console.error('An error occurred:', err.message);
});

Neste exemplo:

  • Criamos um fluxo gravável em um arquivo chamado output.txt.
  • Gravamos vários blocos de dados no arquivo usando write().
  • O evento final é emitido assim que todos os dados forem gravados.

Tubulação de fluxos juntos

Um dos recursos poderosos dos streams do Node.js é a capacidade de conectá-los. Isso significa que você pode conectar vários streams, passando dados de um stream para outro. Por exemplo, você pode ler dados de um fluxo e gravá-los diretamente em outro fluxo.

Exemplo: canalizando um fluxo legível para um fluxo gravável

const fs = require('fs');

// Create a readable stream from 'input.txt'
const readableStream = fs.createReadStream('input.txt');

// Create a writable stream to 'output.txt'
const writableStream = fs.createWriteStream('output.txt');

// Pipe the readable stream to the writable stream
readableStream.pipe(writableStream);

// Handle 'finish' event for when writing completes
writableStream.on('finish', () => {
    console.log('Data has been successfully piped and written to output.txt');
});

Neste exemplo:

  • O método pipe() é usado para passar dados do fluxo legível (input.txt) para o fluxo gravável (output.txt).
  • Isso é útil ao copiar arquivos ou passar dados entre processos.

Casos práticos de uso de streams

Streams são úteis em vários cenários do mundo real, incluindo:

  1. Uploads/downloads de arquivos: Tratamento eficiente de uploads e downloads de arquivos sem carregar o arquivo inteiro na memória.
  2. Streaming de vídeo/áudio: os streams permitem que você forneça ou receba mídia em partes, permitindo uma reprodução perfeita.
  3. Processamento de dados em tempo real: Streams são perfeitos para lidar com fluxos de dados como dados de sensores, registros ou feeds do mercado de ações.
  4. Tratamento de arquivos grandes: leitura e processamento de arquivos de log grandes ou conjuntos de dados em partes sem esgotar a memória do sistema.

Tratamento de erros em streams

Ao trabalhar com streams, é essencial lidar com os erros de maneira adequada. Cada stream pode emitir um evento de erro que deve ser capturado para evitar travamentos.

Exemplo: tratamento de erros em streams

const fs = require('fs');

// Create a readable stream from a non-existent file
const readableStream = fs.createReadStream('non_existent_file.txt');

// Handle the 'error' event
readableStream.on('error', (err) => {
    console.error('An error occurred:', err.message);
});

Se o arquivo non_existent_file.txt não existir, o evento 'error' será acionado e uma mensagem de erro apropriada será registrada. O tratamento adequado de erros garante que seu aplicativo não trave inesperadamente.

Conclusão

Streams Node.js fornecem uma maneira eficiente e poderosa de lidar com grandes conjuntos de dados e dados em tempo real. Ao ler e gravar dados em partes, você pode reduzir significativamente o uso de memória e aumentar o desempenho. Esteja você trabalhando com sistemas de arquivos, feeds de dados em tempo real ou streaming de mídia, os streams em Node.js tornam essas tarefas mais fáceis e com melhor desempenho.

Neste artigo, cobrimos os fundamentos dos streams Node.js, incluindo leitura e gravação de streams, canalização de streams juntos e casos de uso práticos. Também discutimos como lidar com erros de forma eficaz para garantir robustez em aplicativos baseados em fluxo.

Ao dominar os streams, você libera todo o potencial do Node.js para construir aplicativos escalonáveis, eficientes e de alto desempenho.

A seguir, continuaremos nossa série mergulhando em tópicos mais avançados, como dimensionamento de aplicativos Node.js e uso do NGINX para servir conteúdo estático. Fique atento!

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/imsushant12/nodejs-streams-what-why-and-how-to-use-them-5d4f?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3