Node js Streams Tutorial: Filestream, Pipes

Filström i Node.js

Node använder strömmar i stor utsträckning som en dataöverföringsmekanism.

Till exempel, när du matar ut något till konsolen med hjälp av console.log-funktionen, använder du faktiskt en ström för att skicka data till konsolen.

Node.js har också möjlighet att strömma data från filer så att de kan läsas och skrivas på lämpligt sätt. Vi ska nu titta på ett exempel på hur vi kan använda strömmar för att läsa och skriva från filer. Vi måste följa stegen nedan för detta exempel

Steg 1) Skapa en fil som heter data.txt som har nedanstående data. Låt anta att den här filen är lagrad på D-enheten på vår lokala maskin.

Handledning om Node.js

Beskrivning

Evenemang

Generators

Dataanslutning

Använder Jasmine

Steg 2) Skriv den relevanta koden som kommer att använda strömmar för att läsa data från filen.

Filström i Node.js

var fs = require("fs");
var stream;
stream = fs.createReadStream("D://data.txt");

stream.on("data", function(data) {
    var chunk = data.toString();
    console.log(chunk);
}); 

Kodförklaring:-

  1. Vi måste först inkludera 'fs'-modulerna som innehåller all funktionalitet som krävs för att skapa strömmar.
  2. Därefter skapar vi en läsbar ström genom att använda metoden – createReadStream. Som en ingång anger vi platsen för vår data.txt-fil.
  3. Funktionen steam.on är en händelsehanterare och i den anger vi den första parametern som 'data'. Detta innebär att närhelst data kommer in i strömmen från filen, kör sedan en återuppringningsfunktion. I vårt fall definierar vi en återuppringningsfunktion som kommer att utföra 2 grundläggande steg. Den första är att konvertera data som läses från filen som en sträng. Den andra skulle vara att skicka den konverterade strängen som en utdata till konsolen.
  4. Vi tar varje bit av data som läses från dataströmmen och konverterar den till en sträng.
  5. Slutligen skickar vi utdata från varje strängkonverterad bit till konsolen.

Produktion:

Filström i Node.js

  • Om koden exekveras korrekt kommer du att se ovanstående utdata i konsolen. Denna utdata kommer att vara densamma som i data.txt-filen.

Skriver till en fil

På samma sätt som vi skapar en läsström, kan vi också skapa en skrivström för att skriva data till en fil. Låt oss först skapa en tom fil utan innehåll som kallas data.txt. Låt oss anta att den här filen är placerad i D-enheten på vår dator.

Koden nedan visar hur vi kan skriva data till filen.

Filström i Node.js

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") 

Kodförklaring:-

  1. Vi skapar en skrivbar ström genom att använda metoden – createWriteStream. Som en ingång anger vi platsen för vår data.txt-fil.
  2. Därefter använde vi stream.write en metod för att skriva de olika textraderna till vår textfil. Strömmen kommer att ta hand om att skriva denna data till data.txt-filen.

Om du öppnar filen data.txt kommer du nu att se följande data i filen

Handledning om Node.js

Beskrivning

Evenemang

Generators

Dataanslutning

Använda Jasmin

Rör i Node.js

Inom Node-applikationer kan strömmar kopplas samman med pipe()-metoden, som tar två argument:

  • En obligatorisk skrivbar ström som fungerar som destination för data och
  • Ett valfritt objekt som används för att skicka in alternativ.

Ett typiskt exempel på användning av pipes, om du vill överföra data från en fil till en annan.

Så låt oss se ett exempel på hur vi kan överföra data från en fil till den andra med hjälp av rör.

Steg 1) Skapa en fil som heter datainput.txt som har nedanstående data. Låt anta att den här filen är lagrad på D-enheten på vår lokala maskin.

Handledning om Node.js

Beskrivning

Evenemang

Generators

Dataanslutning

Använder Jasmine

Steg 2) Skapa en tom tom fil som heter dataOutput.txt och placera den på D-enheten på din lokala dator.

Steg 3) Skriv nedanstående kod för att utföra överföringen av data från filen datainput.txt till filen dataOutput.txt.

Rör i Node.js

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

Kodförklaring:-

  1. Vi skapar först en "readstream" till vår datainput.txt-fil som innehåller all vår data som behöver överföras till den nya filen.
  2. Vi måste sedan skapa en "writestream" till vår dataOutput.txt-fil, som är vår tomma fil och är destinationen för överföringen av data från filen datainput.txt.
  3. Vi använder sedan pipe-kommandot för att överföra data från läsströmmen till skrivströmmen. Pipekommandot tar all data som kommer in i läsströmmen och skjuter den till skrivströmmen.

Om du nu öppnar filen dataOutput.txt kommer du att se all data som fanns i filen datainput.txt.

Händelser i Node.js

Händelser är ett av nyckelbegreppen i Node.js och ibland kallas Node.js för ett händelsestyrt ramverk.

I grund och botten är en händelse något som händer. Till exempel, om en anslutning upprättas till en databas, utlöses databasanslutningshändelsen. Händelsedriven programmering är att skapa funktioner som kommer att triggas när specifika händelser utlöses.

Låt oss titta på ett grundläggande exempel på att definiera en händelse i Node.js.

Vi kommer att skapa en händelse som heter 'data_received'. När denna händelse utlöses kommer texten "data mottagen" att skickas till konsolen.

Händelser i Node.js

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

eventEmitter.emit('data_received'); 

Kodförklaring:-

  1. Använd funktionen kräver för att inkludera modulen "händelser". Med den här modulen kommer du att kunna skapa händelser i Node.js.
  2. Skapa en ny händelsesändare. Detta används för att binda händelsen, som i vårt fall är "data_received" till en återuppringningsfunktion som definieras i steg 3.
  3. Vi definierar en händelsedriven funktion som säger att om "data_received"-händelsen utlöses så ska vi mata ut texten "data_received" till konsolen.
  4. Slutligen har vi en manuell utlösning av vår händelse med funktionen eventEmiter.emit. Detta kommer att utlösa händelsen data_received.

När programmet körs kommer texten "data mottagen" att skickas till konsolen som visas nedan.

Händelser i Node.js

Emitting Events

När man definierar händelser finns det olika metoder för händelser som kan åberopas. Det här ämnet fokuserar på att titta på var och en av dem i detalj.

  1. Engångshändelsehanterare

Ibland kan du vara intresserad av att reagera på en händelse endast första gången den inträffar. I dessa situationer kan du använda metoden once() .

Låt oss se hur vi kan använda engångsmetoden för händelsehanterare.

Emitting Events

Kodförklaring:-

  1. Här använder vi metoden 'once' för att säga att för händelsen 'data_received' ska återuppringningsfunktionen endast köras en gång.
  2. Här utlöser vi manuellt händelsen 'data_received'.
  3. När händelsen 'data_received' utlöses igen, den här gången kommer ingenting att hända. Detta beror på det första steget där vi sa att händelsen bara kunde utlösas en gång.

Om koden exekveras korrekt kommer utdata i loggen att vara 'data_received framgångsrikt'. Detta meddelande visas bara en gång i konsolen.

  1. Inspektera evenemangslyssnare

När som helst under sin livstid kan en händelsesändare ha noll eller fler lyssnare kopplade till sig. Lyssnarna för varje evenemangstyp kan inspekteras på flera sätt.

Om du bara är intresserad av att bestämma antalet anslutna lyssnare, leta inte längre än metoden EventEmitter.listenerCount().

(Obs: Lyssnare är viktiga eftersom huvudprogrammet bör veta om lyssnare läggs till i farten till ett evenemang, annars kommer programmet att inte fungera eftersom ytterligare lyssnare kommer att bli uppringda.)

Emitting Events

Kodförklaring:-

  1. Vi definierar en eventEmitter-typ som krävs för att använda de händelserelaterade metoderna.
  2. Vi definierar sedan ett objekt som kallas emitter som kommer att användas för att definiera våra händelsehanterare.
  3. Vi skapar 2 händelsehanterare som i princip inte gör någonting. Detta är enkelt för vårt exempel bara för att visa hur listenerCount-metoden fungerar.
  4. När du nu anropar listenerCount-metoden på vår data_received-händelse, kommer den att skicka antalet händelseavlyssnare kopplade till denna händelse i konsolloggen.

Om koden exekveras korrekt kommer värdet 2 att visas i konsolloggen.

  1. The newListener Event

Varje gång en ny händelsehanterare registreras avger händelsesändaren en newListener-händelse. Denna händelse används för att upptäcka nya händelsehanterare. Du använder vanligtvis newListener-händelse när du behöver allokera resurser eller utföra någon åtgärd för varje ny händelsehanterare.

Emitting Events

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() {}); 

Kodförklaring:-

  1. Vi skapar en ny händelsehanterare för händelsen 'newListener'. Så när en ny händelsehanterare registreras, kommer texten "Lägg till lyssnare för" + händelsenamnet att visas i konsolen.
  2. Här skriver vi till konsolen texten "Added listener for" + händelsenamnet för varje registrerad händelse.
  3. Vi definierar 2 händelsehanterare för vår händelse 'data_received'.

Om ovanstående kod exekveras korrekt, kommer nedanstående text att visas i konsolen. Det visar bara att händelsehanteraren 'newListener' utlöstes två gånger.

Lade till lyssnare för data_received-händelser

Lade till lyssnare för data_received-händelser

Sammanfattning

  • Strömmar används i Node.js för att läsa och skriva data från Input-Output-enheter. node.js använder "fs"-biblioteket för att skapa läsbara och skrivbara strömmar till filer. Dessa strömmar kan användas för att läsa och skriva data från filer.
  • Rör kan användas för att koppla ihop flera strömmar. Ett av de vanligaste exemplen är att koppla ihop läs- och skrivströmmen för överföring av data från en fil till en annan.
  • Node.js är ofta också taggad som ett händelsedrivet ramverk, och det är väldigt enkelt att definiera händelser i Node.js. Funktioner kan definieras som svarar på dessa händelser.
  • Händelser avslöjar också metoder för att svara på viktiga händelser. Till exempel har vi sett händelsehanteraren once() som kan användas för att säkerställa att en återuppringningsfunktion endast exekveras en gång när en händelse utlöses.