O que são?

Streams são um mecanismo de fluxo de dados contínuos. Os streams possibilitam que você trabalhe com grandes fluxos de dados sem a necessidade de carregá-lo por completo na memória.

Como o node consegue trabalhar com os dados sem carregá-lo por completo?

No node.js existe um tipo de dados chamado Buffer. O buffer consegue dividir qualquer dado em pequenos pedacinhos (chunks) e trabalhar com eles individualmente.

Esses pedaços, passam por um “funil” ou “cano” (pipe). E são processados, por fim, você pode fazer o que quiser com o dado nesse momento.

Os chunks fazem com que você evite o desperdício de memória e processamento, tornando tudo muito mais simples.

Exemplo prático

Imagine que você está lendo dados de alguma fonte e você quer armazenar esses dados em um arquivo csv, contudo, são milhares de linhas contendo informações.

Link do repositório para que você consiga acompanhar a evolução do script.

Readable stream

Criaremos antecipadamente, os dados a partir de uma readable stream, usando um for simples:

Geração de dados com Readable Stream
Geração de dados com Readable Stream

Logo após executar o código acima, os dados são “jogados” no console de forma completamente desorganizada.

Desse modo, precisamos transformar esses dados em um formato mais amigável, que nesse caso seria o csv.

Transform stream

Portanto, usaremos a stream de transformação para modificar os dados conforme o formato desejado:

Transformação dos dados com Transform stream
Transform stream

A função _transform recebe 3 parâmetros:

  • Chunk: nosso pedaço de dado que acabamos de receber.
  • Encoding: para caso você queira mudar o encoding.
  • Callback: função que recebe um erro e o dado que acabamos de modificar.

Desse modo, você terá os dados bem mais organizados no console, mas falta uma coisa, armazenar esses dados em um arquivo csv, apesar de já estarmos usando a writable stream em momento nenhum estamos armazenando os dados.

Writable Stream

A princípio, definiremos o cabeçalho do arquivo csv:

Definindo o cabeçalho do csv com a Transform Stream
Definindo o cabeçalho do csv

Posteriormente, tudo que você tem que fazer é salvar os dados:

Escrevendo dados no arquivo csv com uma Writale stream
Escrevendo dados no arquivo csv

Finalmente, nosso script está fazendo o que foi proposto, utilizando streams sob demanda.

Em outras palavras, os dados poderiam ter terabytes, que o node.js conseguiria processar esses dados. Contudo, você precisa de muita memória e de uma boa CPU, quando for processar grandes quantidades de dados.

Conclusão

Por fim, ao executarmos o nosso script, ele gerará para nós um arquivo .csv com todas as informações:

Dados salvos

Você poderia fazer, o que quiser com esses dados antes de salvá-los sob demanda, no nosso exemplo apenas deixei em caixa alta.

Contudo, se fosse um csv de uma empresa, por exemplo, você poderia gerar relatório, de venda, de estoque, etc. São inúmeras as possibilidades.

Como pode ver, streams são tão simples como qualquer outra coisa no node, além de ser uma das bases fundamentais do node.js, espero que tenha gostado da leitura, um abraço e até a próxima.

Saiba mais