Tutorial do Node js Streams: Filestream, Pipes

Índice:

Anonim

Neste tutorial, você aprenderá

  • Filestream em Node.js
  • Pipes em Node.js
  • Eventos em Node.js
  • Eventos emissores

Filestream em Node.js

O Node faz uso extensivo de streams como mecanismo de transferência de dados.

Por exemplo, ao enviar qualquer coisa para o console usando a função console.log, você está, na verdade, usando um fluxo para enviar os dados ao console.

O Node.js também tem a capacidade de transmitir dados de arquivos para que possam ser lidos e gravados de forma adequada. Agora veremos um exemplo de como podemos usar streams para ler e gravar arquivos. Precisamos seguir as etapas mencionadas abaixo para este exemplo

Etapa 1) Crie um arquivo chamado data.txt que contém os dados abaixo. Vamos supor que esse arquivo esteja armazenado na unidade D de nossa máquina local.

Tutorial em Node.js

Introdução

Eventos

Geradores

Conectividade de dados

Usando Jasmine

Etapa 2) Escreva o código relevante que fará uso de streams para ler os dados do arquivo.

var fs = require("fs");var stream;stream = fs.createReadStream("D://data.txt");stream.on("data", function(data) {var chunk = data.toString();console.log(chunk);});

Explicação do código: -

  1. Primeiro, precisamos incluir os módulos 'fs' que contêm todas as funcionalidades necessárias para criar fluxos.
  2. Em seguida, criamos um fluxo legível usando o método - createReadStream. Como entrada, fornecemos a localização do nosso arquivo data.txt.
  3. A função steam.on é um manipulador de eventos e nela estamos especificando o primeiro parâmetro como 'dados'. Isso significa que sempre que os dados entrarem no fluxo do arquivo, execute uma função de retorno de chamada. No nosso caso, estamos definindo uma função de retorno de chamada que realizará 2 etapas básicas. O primeiro é converter os dados lidos do arquivo em uma string. A segunda seria enviar a string convertida como uma saída para o console.
  4. Estamos pegando cada bloco de dados que é lido do fluxo de dados e convertendo-o em uma string.
  5. Finalmente, estamos enviando a saída de cada pedaço convertido de string para o console.

Resultado:

  • Se o código for executado corretamente, você verá a saída acima no console. Essa saída será a mesma do arquivo data.txt.

Gravando em um arquivo

Da mesma forma, que criamos um fluxo de leitura, também podemos criar um fluxo de gravação para gravar dados em um arquivo. Vamos primeiro criar um arquivo vazio sem conteúdo chamado data.txt. Vamos supor que este arquivo esteja localizado na unidade D do nosso computador.

O código a seguir mostra como podemos gravar dados no arquivo.

var fs = require("fs");var stream;stream = fs.createWriteStream("D://data.txt");stream.write("Tutorial on Node.js")stream.write("Introduction")stream.write("Events")stream.write("Generators")stream.write("Data Connectivity")stream.write("Using Jasmine")

Explicação do código: -

  1. Estamos criando um fluxo gravável usando o método - createWriteStream. Como entrada, fornecemos a localização do nosso arquivo data.txt.
  2. Em seguida, usamos o método stream.write para escrever as diferentes linhas de texto em nosso arquivo de texto. O stream se encarregará de gravar esses dados no arquivo data.txt.

Se você abrir o arquivo data.txt, verá agora os seguintes dados no arquivo

Tutorial em Node.js

Introdução

Eventos

Geradores

Conectividade de dados

Usando Jasmine

Pipes em Node.js

Nos aplicativos do Node, os fluxos podem ser canalizados usando o método pipe (), que usa dois argumentos:

  • Um fluxo gravável necessário que atua como destino para os dados e
  • Um objeto opcional usado para passar opções.

Um exemplo típico de uso de tubos, se você deseja transferir dados de um arquivo para outro.

Então, vamos ver um exemplo de como podemos transferir dados de um arquivo para outro usando tubos.

Etapa 1) Crie um arquivo chamado datainput.txt que contém os dados abaixo. Vamos supor que esse arquivo esteja armazenado na unidade D de nossa máquina local.

Tutorial em Node.js

Introdução

Eventos

Geradores

Conectividade de dados

Usando Jasmine

Etapa 2) Crie um arquivo vazio em branco chamado dataOutput.txt e coloque-o na unidade D de sua máquina local.

Etapa 3) Escreva o código abaixo para realizar a transferência dos dados do arquivo datainput.txt para o arquivo dataOutput.txt.

var fs = require("fs");var readStream = fs.createReadStream("D://datainput.txt");var writeStream = fs.createWriteStream("D://dataOutput.txt");readStream.pipe(writeStream);

Explicação do código: -

  1. Estamos criando primeiro um "readstream" para nosso arquivo datainput.txt que contém todos os nossos dados que precisam ser transferidos para o novo arquivo.
  2. Em seguida, precisamos criar um "writeestream" para nosso arquivo dataOutput.txt, que é nosso arquivo vazio e é o destino para a transferência de dados do arquivo datainput.txt.
  3. Em seguida, usamos o comando pipe para transferir os dados do fluxo de leitura para o fluxo de gravação. O comando pipe pegará todos os dados que entram no fluxo de leitura e os enviará para o fluxo de gravação.

Se você agora abrir o arquivo dataOutput.txt, verá todos os dados que estavam presentes no arquivo datainput.txt.

Eventos em Node.js

Os eventos são um dos conceitos-chave no Node.js e, às vezes, o Node.js é referido como uma estrutura orientada a eventos.

Basicamente, um evento é algo que acontece. Por exemplo, se uma conexão for estabelecida com um banco de dados, o evento de conexão com o banco de dados será acionado. A programação orientada a eventos visa criar funções que serão acionadas quando eventos específicos forem acionados.

Vejamos um exemplo básico de definição de um evento em Node.js.

Vamos criar um evento chamado 'data_received'. Quando este evento for acionado, o texto "dados recebidos" será enviado para o console.

var events = require('events');var eventEmitter = new events.EventEmitter();eventEmitter.on('data_received', function() {console.log('data received succesfully.');});eventEmitter.emit('data_received');

Explicação do código: -

  1. Use a função require para incluir o módulo 'eventos'. Com este módulo, você poderá criar eventos em Node.js.
  2. Crie um novo emissor de eventos. Isso é usado para vincular o evento, que em nosso caso é "data_received" a uma função de retorno de chamada definida na etapa 3.
  3. Definimos uma função orientada a eventos que diz que se no caso de o evento "data_received" ser disparado, devemos enviar o texto "data_received" para o console.
  4. Por fim, temos um acionador manual de nosso evento usando a função eventEmiter.emit. Isso irá disparar o evento data_received.

Quando o programa é executado, o texto "dados recebidos" será enviado para o console conforme mostrado abaixo.

Eventos emissores

Ao definir eventos, existem diferentes métodos para eventos que podem ser chamados. Este tópico se concentra em examinar cada um deles em detalhes.

  1. Manipuladores de eventos únicos

Às vezes, você pode estar interessado em reagir a um evento apenas na primeira vez que ele ocorrer. Nessas situações, você pode usar o método once ().

Vamos ver como podemos usar o método once para manipuladores de eventos.

Explicação do código: -

  1. Aqui, estamos usando o método 'uma vez' para dizer que para o evento 'data_received', a função de retorno de chamada deve ser executada apenas uma vez.
  2. Aqui estamos disparando manualmente o evento 'data_received'.
  3. Quando o evento 'data_received' for acionado novamente, desta vez, nada acontecerá. Isso se deve à primeira etapa em que dissemos que o evento só poderia ser acionado uma vez.

Se o código for executado corretamente, a saída no log será 'data_received com êxito'. Esta mensagem aparecerá apenas uma vez no console.

  1. Inspecionando ouvintes de eventos

Em qualquer momento de sua vida, um emissor de evento pode ter zero ou mais ouvintes anexados a ele. Os ouvintes para cada tipo de evento podem ser inspecionados de várias maneiras.

Se você estiver interessado apenas em determinar o número de ouvintes anexados, não procure além do método EventEmitter.listenerCount ().

( Observação: os ouvintes são importantes porque o programa principal deve saber se os ouvintes estão sendo adicionados imediatamente a um evento, caso contrário, o programa não funcionará bem porque ouvintes adicionais serão chamados.)

Explicação do código: -

  1. Estamos definindo um tipo de eventEmitter que é necessário para usar os métodos relacionados a eventos.
  2. Estamos então definindo um objeto chamado emissor que será usado para definir nossos tratadores de evento.
  3. Estamos criando 2 manipuladores de eventos que basicamente não fazem nada. Isso é simples em nosso exemplo apenas para mostrar como o método listenerCount funciona.
  4. Agora, quando você invocar o método listenerCount em nosso evento data_received, ele enviará o número de ouvintes de evento anexados a este evento no log do console.

Se o código for executado corretamente, o valor 2 será mostrado no log do console.

  1. O evento newListener

Cada vez que um novo manipulador de eventos é registrado, o emissor de eventos emite um evento newListener. Este evento é usado para detectar novos manipuladores de eventos. Normalmente, você usa o evento newListener quando precisa alocar recursos ou executar alguma ação para cada novo manipulador de eventos.

var events = require('events');var eventEmitter = events.EventEmitter;var emitter = new eventEmitter();emitter.on("newListener", function(eventName, listener) {console.log("Added listener for " + eventName + " events");});emitter.on('data_received', function() {});emitter.on('data_received', function() {});

Explicação do código: -

  1. Estamos criando um novo manipulador de eventos para o evento 'newListener'. Portanto, sempre que um novo manipulador de eventos for registrado, o texto "Ouvinte adicionado para" + o nome do evento será exibido no console.
  2. Aqui, estamos escrevendo no console o texto "Ouvinte adicionado para" + o nome do evento para cada evento registrado.
  3. Estamos definindo 2 manipuladores de eventos para nosso evento 'data_received'.

Se o código acima for executado corretamente, o texto abaixo será mostrado no console. Isso apenas mostra que o manipulador de eventos 'newListener' foi disparado duas vezes.

Ouvinte adicionado para eventos data_received

Ouvinte adicionado para eventos data_received

Resumo

  • Streams são usados ​​em Node.js para ler e gravar dados de dispositivos de entrada-saída. O Node.js usa a biblioteca 'fs' para criar fluxos legíveis e graváveis ​​para arquivos. Esses fluxos podem ser usados ​​para ler e gravar dados de arquivos.
  • Pipes podem ser usados ​​para conectar vários fluxos juntos. Um dos exemplos mais comuns é canalizar o fluxo de leitura e gravação para a transferência de dados de um arquivo para outro.
  • Node.js também é frequentemente marcado como uma estrutura orientada a eventos e é muito fácil definir eventos em Node.js. Podem ser definidas funções que respondem a esses eventos.
  • Os eventos também expõem métodos para responder a eventos importantes. Por exemplo, vimos o manipulador de eventos once () que pode ser usado para garantir que uma função de retorno de chamada seja executada apenas uma vez quando um evento for disparado.