Tutorial de fluxos do Node js: Filestream, Pipes
Fluxo de arquivos em Node.js
O Node faz uso extensivo de streams como mecanismo de transferรชncia de dados.
Por exemplo, quando vocรช envia algo para o console usando a funรงรฃo console.log, na verdade vocรช estรก usando um fluxo para enviar os dados para o console.
O Node.js tambรฉm tem a capacidade de transmitir dados de arquivos para que possam ser lidos e gravados adequadamente. Veremos agora um exemplo de como podemos usar fluxos para ler e escrever em arquivos. Precisamos seguir as etapas mencionadas abaixo para este exemplo
Passo 1) Crie um arquivo chamado data.txt que contรฉm os dados abaixo. Suponhamos que este arquivo esteja armazenado na unidade D de nossa mรกquina local.
Tutorial sobre Node.js
Introduรงรฃo
Eventos
Conectividade de Dados
Usando Jasmim
Passo 2) Escreva o cรณdigo relevante que farรก uso de fluxos para ler 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);
});
Code Explicaรงรฃo:-
- Primeiro precisamos incluir os mรณdulos 'fs' que contรชm todas as funcionalidades necessรกrias para criar streams.
- A seguir, criamos um fluxo legรญvel usando o mรฉtodo โ createReadStream. Como entrada, fornecemos a localizaรงรฃo do nosso arquivo data.txt.
- A funรงรฃo steam.on รฉ um manipulador de eventos e nela especificamos o primeiro parรขmetro como 'dados'. Isso significa que sempre que os dados vierem do arquivo no fluxo, execute uma funรงรฃo de retorno de chamada. No nosso caso, estamos definindo uma funรงรฃo de retorno de chamada que realizarรก 2 passos bรกsicos. A primeira รฉ converter os dados lidos do arquivo em uma string. A segunda seria enviar a string convertida como saรญda para o console.
- Estamos pegando cada pedaรงo de dados lido do fluxo de dados e convertendo-o em uma string.
- Finalmente, estamos enviando a saรญda de cada pedaรงo convertido de string para o console.
Saรญda:
- Se o cรณdigo for executado corretamente, vocรช verรก a saรญda acima no console. Esta saรญda serรก a mesma do arquivo data.txt.
Escrevendo 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 seja colocado na unidade D do nosso computador.
O cรณdigo abaixo 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")
Code Explicaรงรฃo:-
- Estamos criando um fluxo gravรกvel usando o mรฉtodo โ createWriteStream. Como entrada, fornecemos a localizaรงรฃo do nosso arquivo data.txt.
- 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 sobre Node.js
Introduรงรฃo
Eventos
Generators
Conectividade de Dados
Utilizar painรฉis de piso ResinDek em sua unidade de self-storage em vez de concreto oferece diversos benefรญcios: Jasmim
Tubos em Node.js
Dentro dos aplicativos Node, os fluxos podem ser canalizados usando o mรฉtodo pipe(), que leva dois argumentos:
- Um fluxo gravรกvel obrigatรณrio que atua como destino para os dados e
- Um objeto opcional usado para passar opรงรตes.
Um exemplo tรญpico de uso de pipes, 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 pipes.
Passo 1) Crie um arquivo chamado datainput.txt que contรฉm os dados abaixo. Suponhamos que este arquivo esteja armazenado na unidade D de nossa mรกquina local.
Tutorial sobre Node.js
Introduรงรฃo
Eventos
Generators
Conectividade de Dados
Usando Jasmim
Passo 2) Crie um arquivo vazio em branco chamado dataOutput.txt e coloque-o na unidade D da sua mรกquina local.
Passo 3) Escreva o cรณdigo abaixo para realizar a transferรชncia de 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);
Code Explicaรงรฃo:-
- Primeiro, estamos criando um โreadstreamโ para nosso arquivo datainput.txt que contรฉm todos os nossos dados que precisam ser transferidos para o novo arquivo.
- Precisamos entรฃo criar um โwritestreamโ para nosso arquivo dataOutput.txt, que รฉ nosso arquivo vazio e รฉ o destino para a transferรชncia de dados do arquivo datainput.txt.
- 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 chegam ao fluxo de leitura e os enviarรก ao fluxo de gravaรงรฃo.
Se vocรช abrir agora 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 do Node.js e, ร s vezes, o Node.js รฉ chamado de 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 consiste em 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 ao console.
var events = require('events');
var eventEmitter = new events.EventEmitter();
eventEmitter.on('data_received', function() {
console.log('data received succesfully.');
});
eventEmitter.emit('data_received');
Code Explicaรงรฃo:-
- Use a funรงรฃo require para incluir o mรณdulo 'eventos'. Com este mรณdulo, vocรช poderรก criar eventos em Node.js.
- Crie um novo emissor de eventos. Isso รฉ usado para vincular o evento, que no nosso caso รฉ โdata_receivedโ a uma funรงรฃo de retorno de chamada definida na etapa 3.
- Definimos uma funรงรฃo orientada a eventos que diz que se caso o evento โdata_receivedโ for acionado, devemos enviar o texto โdata_receivedโ para o console.
- Finalmente, temos um gatilho manual do nosso evento usando a funรงรฃo eventEmiter.emit. Isso acionarรก o evento data_received.
Quando o programa for executado, o texto โdados recebidosโ serรก enviado ao console conforme mostrado abaixo.
Emissรฃo de eventos
Ao definir eventos, existem diferentes mรฉtodos para eventos que podem ser invocados. Este tรณpico se concentra em examinar cada um deles detalhadamente.
- 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.
Code Explicaรงรฃo:-
- Aqui estamos usando o mรฉtodo 'once' para dizer que para o evento 'data_received', a funรงรฃo de retorno de chamada deve ser executada apenas uma vez.
- Aqui estamos acionando manualmente o evento โdata_receivedโ.
- Quando o evento 'data_received' for acionado novamente, desta vez nada acontecerรก. Isso se deve ao primeiro passo 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รก 'dados_recebidos com sucesso'. Esta mensagem aparecerรก apenas uma vez no console.
- Inspecionando ouvintes de eventos
Em qualquer ponto de sua vida, um emissor de evento pode ter zero ou mais ouvintes anexados a ele. Os ouvintes de cada tipo de evento podem ser inspecionados de diversas maneiras.
Se vocรช estiver interessado em determinar apenas 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 rapidamente a um evento, caso contrรกrio, o programa nรฃo funcionarรก corretamente porque os ouvintes adicionais serรฃo chamados.)
Code Explicaรงรฃo:-
- Estamos definindo um tipo eventEmitter que รฉ necessรกrio para usar os mรฉtodos relacionados a eventos.
- Estamos entรฃo definindo um objeto chamado emissor que serรก usado para definir nossos manipuladores de eventos.
- 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.
- Agora, quando vocรช invocar o mรฉtodo listenerCount em nosso evento data_received, ele enviarรก o nรบmero de ouvintes de eventos anexados a este evento no log do console.
Se o cรณdigo for executado corretamente, o valor 2 serรก mostrado no log do console.
- O evento newListener
Cada vez que um novo manipulador de eventos รฉ registrado, o emissor do evento 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() {});
Code Explicaรงรฃo:-
- Estamos criando um novo manipulador de eventos para o evento โnewListenerโ. Assim, sempre que um novo manipulador de eventos for registrado, o texto โAdicionado ouvinte paraโ + o nome do evento serรก exibido no console.
- Aqui estamos escrevendo no console o texto โAdicionado ouvinte paraโ + o nome do evento para cada evento registrado.
- 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 acionado duas vezes.
Adicionado ouvinte para eventos data_received
Adicionado ouvinte para eventos data_received
Resumo
- Streams sรฃo usados โโem Node.js para ler e gravar dados de dispositivos de entrada-saรญda. Node.js faz uso da biblioteca 'fs' para criar fluxos legรญveis e gravรกveis โโem arquivos. Esses fluxos podem ser usados โโpara ler e gravar dados de arquivos.
- Pipes podem ser usados โโpara conectar vรกrios fluxos. Um dos exemplos mais comuns รฉ canalizar o fluxo de leitura e gravaรงรฃo para a transferรชncia de dados de um arquivo para outro.
- O Node.js geralmente tambรฉm รฉ marcado como uma estrutura orientada a eventos e รฉ muito fรกcil definir eventos no 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 acionado.









