Node js Streams-zelfstudie: Filestream, Pipes

Filestream in Node.js

Node maakt uitgebreid gebruik van streams als mechanisme voor gegevensoverdracht.

Wanneer u bijvoorbeeld iets naar de console uitvoert met behulp van de console.log-functie, gebruikt u feitelijk een stream om de gegevens naar de console te verzenden.

Node.js heeft ook de mogelijkheid om gegevens uit bestanden te streamen, zodat deze op de juiste manier kunnen worden gelezen en geschreven. We zullen nu kijken naar een voorbeeld van hoe we streams kunnen gebruiken om vanuit bestanden te lezen en te schrijven. Voor dit voorbeeld moeten we de onderstaande stappen volgen

Stap 1) Maak een bestand met de naam data.txt dat de onderstaande gegevens bevat. Laten we aannemen dat dit bestand is opgeslagen op de D-schijf van onze lokale machine.

Zelfstudie over Node.js

Introductie

Evenementen

Generators

Data connectiviteit

Jasmijn gebruiken

Stap 2) Schrijf de relevante code die gebruik maakt van streams om gegevens uit het bestand te lezen.

Filestream in 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);
}); 

Code-uitleg: -

  1. We moeten eerst de 'fs'-modules toevoegen die alle functionaliteit bevatten die nodig is om streams te maken.
  2. Vervolgens creëren we een leesbare stream met behulp van de methode createReadStream. Als invoer geven we de locatie van ons data.txt-bestand.
  3. De steam.on-functie is een gebeurtenishandler en daarin specificeren we de eerste parameter als 'data'. Dit betekent dat wanneer er gegevens uit het bestand in de stroom komen, er een callback-functie wordt uitgevoerd. In ons geval definiëren we een callback-functie die twee basisstappen uitvoert. De eerste is om de uit het bestand gelezen gegevens als een string te converteren. De tweede zou zijn om de geconverteerde string als uitvoer naar de console te sturen.
  4. We nemen elk stuk gegevens dat uit de datastroom wordt gelezen en converteren het naar een string.
  5. Ten slotte sturen we de uitvoer van elk string-geconverteerd deel naar de console.

Output:

Filestream in Node.js

  • Als de code correct wordt uitgevoerd, ziet u de bovenstaande uitvoer in de console. Deze uitvoer is dezelfde als die in het data.txt-bestand.

Schrijven naar een bestand

Op dezelfde manier waarop we een leesstroom maken, kunnen we ook een schrijfstroom maken om gegevens naar een bestand te schrijven. Laten we eerst een leeg bestand maken zonder inhoud, genaamd data.txt. Laten we aannemen dat dit bestand op de D-schijf van onze computer is geplaatst.

De onderstaande code laat zien hoe we gegevens naar het bestand kunnen schrijven.

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

Code-uitleg: -

  1. We maken een beschrijfbare stream met behulp van de methode createWriteStream. Als invoer geven we de locatie van ons data.txt-bestand.
  2. Vervolgens gebruikten we de stream.write een methode om de verschillende regels tekst naar ons tekstbestand te schrijven. De stream zorgt ervoor dat deze gegevens naar het data.txt-bestand worden geschreven.

Als u het bestand data.txt opent, ziet u nu het volgendewing gegevens in het bestand

Zelfstudie over Node.js

Introductie

Evenementen

Generators

Data connectiviteit

gebruik Jasmijn

Leidingen in Node.js

Binnen Node-toepassingen kunnen streams aan elkaar worden gekoppeld met behulp van de pipe()-methode, waarvoor twee argumenten nodig zijn:

  • Een vereiste beschrijfbare stream die fungeert als bestemming voor de gegevens en
  • Een optioneel object dat wordt gebruikt om opties door te geven.

Een typisch voorbeeld van het gebruik van pipelines, als u gegevens van het ene bestand naar het andere wilt overbrengen.

Laten we dus een voorbeeld bekijken van hoe we gegevens van het ene bestand naar het andere kunnen overbrengen met behulp van pipelines.

Stap 1) Maak een bestand met de naam datainput.txt dat de onderstaande gegevens bevat. Laten we aannemen dat dit bestand is opgeslagen op de D-schijf van onze lokale machine.

Zelfstudie over Node.js

Introductie

Evenementen

Generators

Data connectiviteit

Jasmijn gebruiken

Stap 2) Maak een leeg leeg bestand met de naam dataOutput.txt en plaats dit op de D-schijf van uw lokale machine.

Stap 3) Schrijf de onderstaande code om de gegevensoverdracht van het datainput.txt-bestand naar het dataOutput.txt-bestand uit te voeren.

Leidingen in Node.js

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

Code-uitleg: -

  1. We maken eerst een “readstream” naar ons datainput.txt-bestand dat al onze gegevens bevat die naar het nieuwe bestand moeten worden overgebracht.
  2. We moeten dan een “writestream” maken naar ons dataOutput.txt-bestand, wat ons lege bestand is en de bestemming is voor de overdracht van gegevens uit het datainput.txt-bestand.
  3. Vervolgens gebruiken we het pipe-commando om de gegevens van de leesstroom naar de schrijfstroom over te brengen. Het pipe-commando neemt alle gegevens die in de leesstroom binnenkomen en duwt deze naar de schrijfstroom.

Als u nu het bestand dataOutput.txt opent, ziet u alle gegevens die in het bestand datainput.txt aanwezig waren.

Gebeurtenissen in Node.js

Gebeurtenissen zijn een van de sleutelconcepten in Node.js en soms wordt Node.js een gebeurtenisgestuurd raamwerk genoemd.

Kortom, een gebeurtenis is iets dat gebeurt. Als er bijvoorbeeld een verbinding met een database tot stand wordt gebracht, wordt de databaseverbindingsgebeurtenis geactiveerd. Gebeurtenisgestuurd programmeren is het creëren van functies die worden geactiveerd wanneer specifieke gebeurtenissen worden geactiveerd.

Laten we eens kijken naar een eenvoudig voorbeeld van het definiëren van een gebeurtenis in Node.js.

We gaan een gebeurtenis maken met de naam 'data_received'. Wanneer deze gebeurtenis wordt geactiveerd, wordt de tekst “data ontvangen” naar de console verzonden.

Gebeurtenissen in 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'); 

Code-uitleg: -

  1. Gebruik de functie require om de module 'evenementen' op te nemen. Met deze module kunt u evenementen maken in Node.js.
  2. Maak een nieuwe gebeurtenissenzender. Dit wordt gebruikt om de gebeurtenis, die in ons geval “data_received” is, te binden aan een callback-functie die is gedefinieerd in stap 3.
  3. We definiëren een gebeurtenisgestuurde functie die zegt dat als de gebeurtenis “data_received” wordt geactiveerd, we de tekst “data_received” naar de console moeten uitvoeren.
  4. Ten slotte hebben we een handmatige trigger van onze gebeurtenis met behulp van de functie eventEmiter.emit. Hierdoor wordt de gebeurtenis data_received geactiveerd.

Wanneer het programma wordt uitgevoerd, wordt de tekst “data ontvangen” naar de console verzonden, zoals hieronder weergegeven.

Gebeurtenissen in Node.js

Gebeurtenissen uitzenden

Bij het definiëren van gebeurtenissen zijn er verschillende methoden voor gebeurtenissen die kunnen worden aangeroepen. Dit onderwerp richt zich op het in detail bekijken van elk van hen.

  1. Eenmalige gebeurtenishandlers

Soms bent u er wellicht alleen in geïnteresseerd om op een gebeurtenis te reageren als deze zich voor de eerste keer voordoet. In deze situaties kunt u de methode once() gebruiken.

Laten we eens kijken hoe we de eenmalige methode voor gebeurtenishandlers kunnen gebruiken.

Gebeurtenissen uitzenden

Code-uitleg: -

  1. Hier gebruiken we de 'once'-methode om te zeggen dat voor de gebeurtenis 'data_received' de callback-functie slechts één keer mag worden uitgevoerd.
  2. Hier activeren we handmatig de gebeurtenis 'data_received'.
  3. Wanneer de gebeurtenis 'data_received' opnieuw wordt geactiveerd, gebeurt er deze keer niets. Dit komt door de eerste stap waarin we zeiden dat de gebeurtenis maar één keer kon worden geactiveerd.

Als de code correct wordt uitgevoerd, is de uitvoer in het logboek 'data_received Successful'. Dit bericht verschijnt slechts één keer in de console.

  1. Gebeurtenislisteners inspecteren

Op elk moment in zijn levensduur kunnen aan een gebeurteniszender nul of meer luisteraars zijn gekoppeld. De luisteraars voor elk gebeurtenistype kunnen op verschillende manieren worden geïnspecteerd.

Als u alleen het aantal gekoppelde luisteraars wilt bepalen, hoeft u niet verder te zoeken dan de methode EventEmitter.listenerCount().

(Opmerking: Luisteraars zijn belangrijk omdat het hoofdprogramma moet weten of er luisteraars direct aan een evenement worden toegevoegd, anders werkt het programma niet goed omdat er extra luisteraars worden gebeld.)

Gebeurtenissen uitzenden

Code-uitleg: -

  1. We definiëren een eventEmitter-type dat vereist is voor het gebruik van de gebeurtenisgerelateerde methoden.
  2. Vervolgens definiëren we een object met de naam emitter dat zal worden gebruikt om onze gebeurtenishandlers te definiëren.
  3. We maken twee gebeurtenishandlers die in principe niets doen. Dit wordt voor ons voorbeeld eenvoudig gehouden om te laten zien hoe de methode listenerCount werkt.
  4. Wanneer u nu de methode listenerCount aanroept voor onze gebeurtenis data_received, wordt het aantal gebeurtenislisteners verzonden dat aan deze gebeurtenis is gekoppeld in het consolelogboek.

Als de code correct wordt uitgevoerd, wordt de waarde 2 weergegeven in het consolelogboek.

  1. Het nieuweListener-evenement

Elke keer dat een nieuwe gebeurtenishandler wordt geregistreerd, verzendt de gebeurteniszender een newListener-gebeurtenis. Deze gebeurtenis wordt gebruikt om nieuwe gebeurtenishandlers te detecteren. Normaal gesproken gebruikt u de gebeurtenis newListener wanneer u bronnen moet toewijzen of een actie moet uitvoeren voor elke nieuwe gebeurtenishandler.

Gebeurtenissen uitzenden

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-uitleg: -

  1. We maken een nieuwe gebeurtenishandler voor de gebeurtenis 'newListener'. Dus telkens wanneer een nieuwe gebeurtenishandler wordt geregistreerd, wordt de tekst “Toegevoegde luisteraar voor” + de gebeurtenisnaam weergegeven in de console.
  2. Hier schrijven we naar de console de tekst "Listener toegevoegd voor" + de gebeurtenisnaam voor elke geregistreerde gebeurtenis.
  3. We definiëren 2 gebeurtenishandlers voor onze gebeurtenis 'data_received'.

Als de bovenstaande code correct wordt uitgevoerd, wordt de onderstaande tekst in de console weergegeven. Het laat alleen zien dat de gebeurtenishandler 'newListener' twee keer is geactiveerd.

Luisteraar toegevoegd voor data_received-gebeurtenissen

Luisteraar toegevoegd voor data_received-gebeurtenissen

Samengevat

  • Streams worden in Node.js gebruikt om gegevens van Input-Output-apparaten te lezen en te schrijven. Node.js maakt gebruik van de 'fs'-bibliotheek om leesbare en beschrijfbare streams naar bestanden te creëren. Deze streams kunnen worden gebruikt om gegevens uit bestanden te lezen en te schrijven.
  • Leidingen kunnen worden gebruikt om meerdere stromen met elkaar te verbinden. Een van de meest voorkomende voorbeelden is het samenvoegen van de lees- en schrijfstroom voor de overdracht van gegevens van het ene bestand naar het andere.
  • Node.js wordt vaak ook bestempeld als een gebeurtenisgestuurd raamwerk, en het is heel eenvoudig om gebeurtenissen in Node.js te definiëren. Er kunnen functies worden gedefinieerd die op deze gebeurtenissen reageren.
  • Gebeurtenissen leggen ook methoden bloot om op belangrijke gebeurtenissen te reageren. We hebben bijvoorbeeld de gebeurtenishandler once() gezien die kan worden gebruikt om ervoor te zorgen dat een callback-functie slechts één keer wordt uitgevoerd wanneer een gebeurtenis wordt geactiveerd.