Node js Streams Tutorial: Filestream, Pipes

Filestream in Node.js

Der Knoten nutzt Streams in groรŸem Umfang als Datenรผbertragungsmechanismus.

Wenn Sie beispielsweise mit der Funktion console.log etwas an die Konsole ausgeben, verwenden Sie tatsรคchlich einen Stream, um die Daten an die Konsole zu senden.

Node.js bietet auรŸerdem die Mรถglichkeit, Daten aus Dateien zu streamen, sodass diese entsprechend gelesen und geschrieben werden kรถnnen. Wir werden uns nun ein Beispiel ansehen, wie wir Streams zum Lesen und Schreiben von Dateien verwenden kรถnnen. Fรผr dieses Beispiel mรผssen wir die unten aufgefรผhrten Schritte befolgen

Schritt 1) Erstellen Sie eine Datei mit dem Namen data.txt, die die folgenden Daten enthรคlt. Nehmen wir an, diese Datei ist auf dem Laufwerk D unseres lokalen Computers gespeichert.

Tutorial zu Node.js

Einfรผhrung

VERANSTALTUNGEN

Generatoren

Datenkonnektivitรคt

Jasmin verwenden

Schritt 2) Schreiben Sie den entsprechenden Code, der Streams zum Lesen von Daten aus der Datei verwendet.

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 Erlรคuterung:-

  1. Zuerst mรผssen wir die โ€žfsโ€œ-Module einbinden, die alle zum Erstellen von Streams erforderlichen Funktionen enthalten.
  2. Als nรคchstes erstellen wir mit der Methode createReadStream einen lesbaren Stream. Als Eingabe geben wir den Speicherort unserer Datei data.txt an.
  3. Die Steam.on-Funktion ist ein Event-Handler und darin geben wir den ersten Parameter als โ€žDatenโ€œ an. Dies bedeutet, dass immer dann, wenn Daten aus der Datei in den Stream eingehen, eine Rรผckruffunktion ausgefรผhrt wird. In unserem Fall definieren wir eine Callback-Funktion, die zwei grundlegende Schritte ausfรผhrt. Die erste besteht darin, die aus der Datei gelesenen Daten in eine Zeichenfolge zu konvertieren. Die zweite wรคre, die konvertierte Zeichenfolge als Ausgabe an die Konsole zu senden.
  4. Wir nehmen jeden Datenblock, der aus dem Datenstrom gelesen wird, und wandeln ihn in einen String um.
  5. SchlieรŸlich senden wir die Ausgabe jedes String-konvertierten Blocks an die Konsole.

Ausgang:

Filestream in Node.js

  • Wenn der Code ordnungsgemรครŸ ausgefรผhrt wird, sehen Sie die obige Ausgabe in der Konsole. Diese Ausgabe ist dieselbe wie die in der Datei data.txt.

In eine Datei schreiben

Auf die gleiche Weise, wie wir einen Lesestream erstellen, kรถnnen wir auch einen Schreibstream erstellen, um Daten in eine Datei zu schreiben. Erstellen wir zunรคchst eine leere Datei ohne Inhalt mit dem Namen data.txt. Nehmen wir an, diese Datei befindet sich auf dem Laufwerk D unseres Computers.

Der folgende Code zeigt, wie wir Daten in die Datei schreiben kรถnnen.

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 Erlรคuterung:-

  1. Wir erstellen einen beschreibbaren Stream mithilfe der Methode โ€“ createWriteStream. Als Eingabe geben wir den Speicherort unserer data.txt-Datei an.
  2. Als nรคchstes haben wir die Methode stream.write verwendet, um die verschiedenen Textzeilen in unsere Textdatei zu schreiben. Der Stream kรผmmert sich darum, diese Daten in die Datei data.txt zu schreiben.

Wenn Sie die Datei data.txt รถffnen, sehen Sie nun folgende Daten in der Datei

Tutorial zu Node.js

Einfรผhrung

VERANSTALTUNGEN

Generatoren

Datenkonnektivitรคt

Die Verwendung von Jasmin

Pipes in Node.js

Innerhalb von Node-Anwendungen kรถnnen Streams mithilfe der Methode โ€žpipe()โ€œ zusammengeleitet werden, die zwei Argumente benรถtigt:

  • Ein erforderlicher beschreibbarer Stream, der als Ziel fรผr die Daten fungiert und
  • Ein optionales Objekt, das zur รœbergabe von Optionen verwendet wird.

Ein typisches Beispiel fรผr die Verwendung von Pipes, wenn Sie Daten von einer Datei in eine andere รผbertragen mรถchten.

Sehen wir uns also ein Beispiel an, wie wir mithilfe von Pipes Daten von einer Datei in die andere รผbertragen kรถnnen.

Schritt 1) Erstellen Sie eine Datei mit dem Namen datainput.txt, die die folgenden Daten enthรคlt. Nehmen wir an, diese Datei ist auf dem Laufwerk D unseres lokalen Computers gespeichert.

Tutorial zu Node.js

Einfรผhrung

VERANSTALTUNGEN

Generatoren

Datenkonnektivitรคt

Jasmin verwenden

Schritt 2) Erstellen Sie eine leere Datei mit dem Namen dataOutput.txt und legen Sie sie auf dem Laufwerk D Ihres lokalen Computers ab.

Schritt 3) Schreiben Sie den folgenden Code, um die รœbertragung von Daten aus der Datei datainput.txt in die Datei dataOutput.txt durchzufรผhren.

Pipes 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 Erlรคuterung:-

  1. Wir erstellen zunรคchst einen โ€žReadstreamโ€œ zu unserer datainput.txt-Datei, der alle unsere Daten enthรคlt, die in die neue Datei รผbertragen werden mรผssen.
  2. AnschlieรŸend mรผssen wir einen โ€žWritestreamโ€œ fรผr unsere Datei โ€ždataOutput.txtโ€œ erstellen, die unsere leere Datei ist und das Ziel fรผr die รœbertragung von Daten aus der Datei โ€ždatainput.txtโ€œ darstellt.
  3. AnschlieรŸend verwenden wir den Pipe-Befehl, um die Daten vom Lesestream zum Schreibstream zu รผbertragen. Der Pipe-Befehl nimmt alle Daten, die in den Lesestream gelangen, und schiebt sie an den Schreibstream.

Wenn Sie nun die Datei dataOutput.txt รถffnen, sehen Sie alle Daten, die in der Datei datainput.txt vorhanden waren.

Ereignisse in Node.js

Ereignisse sind eines der Schlรผsselkonzepte in Node.js und manchmal wird Node.js als ereignisgesteuertes Framework bezeichnet.

Im Grunde ist ein Ereignis etwas, das passiert. Wenn beispielsweise eine Verbindung zu einer Datenbank hergestellt wird, wird das Datenbankverbindungsereignis ausgelรถst. Bei der ereignisgesteuerten Programmierung geht es darum, Funktionen zu erstellen, die ausgelรถst werden, wenn bestimmte Ereignisse ausgelรถst werden.

Schauen wir uns ein einfaches Beispiel fรผr die Definition eines Ereignisses in Node.js an.

Wir werden ein Ereignis namens โ€ždata_receivedโ€œ erstellen. Wenn dieses Ereignis ausgelรถst wird, wird der Text โ€žDaten empfangenโ€œ an die Konsole gesendet.

Ereignisse 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 Erlรคuterung:-

  1. Verwenden Sie die Funktion โ€žrequireโ€œ, um das Modul โ€ževentsโ€œ einzubinden. Mit diesem Modul kรถnnen Sie Ereignisse in Node.js erstellen.
  2. Erstellen Sie einen neuen Ereignisemitter. Dies wird verwendet, um das Ereignis, das in unserem Fall โ€ždata_receivedโ€œ ist, an eine Rรผckruffunktion zu binden, die in Schritt 3 definiert wird.
  3. Wir definieren eine ereignisgesteuerte Funktion, die besagt, dass wir, falls das Ereignis โ€ždata_receivedโ€œ ausgelรถst wird, den Text โ€ždata_receivedโ€œ an die Konsole ausgeben sollen.
  4. SchlieรŸlich haben wir einen manuellen Auslรถser unseres Ereignisses mithilfe der Funktion eventEmiter.emit. Dadurch wird das data_received-Ereignis ausgelรถst.

Wenn das Programm ausgefรผhrt wird, wird der Text โ€žDaten empfangenโ€œ wie unten gezeigt an die Konsole gesendet.

Ereignisse in Node.js

Ereignisse ausgeben

Bei der Definition von Ereignissen gibt es verschiedene Methoden fรผr Ereignisse, die aufgerufen werden kรถnnen. In diesem Thema geht es darum, jeden einzelnen davon im Detail zu betrachten.

  1. Einmalige Event-Handler

Manchmal mรถchten Sie mรถglicherweise nur auf ein Ereignis reagieren, wenn es zum ersten Mal auftritt. In diesen Situationen kรถnnen Sie die Methode Once() verwenden.

Sehen wir uns an, wie wir die Once-Methode fรผr Event-Handler nutzen kรถnnen.

Ereignisse ausgeben

Code Erlรคuterung:-

  1. Hier verwenden wir die Methode โ€žonceโ€œ, um zu sagen, dass die Callback-Funktion fรผr das Ereignis โ€ždata_receivedโ€œ nur einmal ausgefรผhrt werden soll.
  2. Hier lรถsen wir manuell das Ereignis โ€ždata_receivedโ€œ aus.
  3. Wenn das Ereignis โ€ždata_receivedโ€œ erneut ausgelรถst wird, passiert dieses Mal nichts. Dies liegt daran, dass wir im ersten Schritt gesagt haben, dass das Ereignis nur einmal ausgelรถst werden kann.

Wenn der Code ordnungsgemรครŸ ausgefรผhrt wird, lautet die Ausgabe im Protokoll โ€ždata_received erfolgreichโ€œ. Diese Meldung wird nur einmal in der Konsole angezeigt.

  1. รœberprรผfen von Ereignis-Listenern

Zu jedem Zeitpunkt seiner Lebensdauer kรถnnen einem Ereignisemitter null oder mehr Listener zugeordnet sein. Die Listener fรผr jeden Ereignistyp kรถnnen auf verschiedene Arten รผberprรผft werden.

Wenn Sie nur die Anzahl der angeschlossenen Listener ermitteln mรถchten, ist die Methode EventEmitter.listenerCount() genau das Richtige fรผr Sie.

(Hinweis: Zuhรถrer sind wichtig, da das Hauptprogramm wissen sollte, ob Zuhรถrer spontan zu einem Ereignis hinzugefรผgt werden. Andernfalls kommt es zu Fehlfunktionen des Programms, da zusรคtzliche Zuhรถrer aufgerufen werden.)

Ereignisse ausgeben

Code Erlรคuterung:-

  1. Wir definieren einen eventEmitter-Typ, der fรผr die Verwendung der ereignisbezogenen Methoden erforderlich ist.
  2. AnschlieรŸend definieren wir ein Objekt namens Emitter, das zur Definition unserer Event-Handler verwendet wird.
  3. Wir erstellen zwei Event-Handler, die im Grunde nichts tun. In unserem Beispiel ist dies einfach gehalten, nur um zu zeigen, wie die Methode listenerCount funktioniert.
  4. Wenn Sie nun die Methode listenerCount fรผr unser data_received-Ereignis aufrufen, wird die Anzahl der an dieses Ereignis angehรคngten Ereignis-Listener im Konsolenprotokoll gesendet.

Wenn der Code ordnungsgemรครŸ ausgefรผhrt wird, wird im Konsolenprotokoll der Wert 2 angezeigt.

  1. Das newListener-Ereignis

Jedes Mal, wenn ein neuer Ereignishandler registriert wird, gibt der Ereignisemitter ein newListener-Ereignis aus. Dieses Ereignis wird verwendet, um neue Ereignishandler zu erkennen. Normalerweise verwenden Sie das Ereignis newListener, wenn Sie Ressourcen zuweisen oder eine Aktion fรผr jeden neuen Ereignishandler ausfรผhren mรผssen.

Ereignisse ausgeben

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 Erlรคuterung:-

  1. Wir erstellen einen neuen Eventhandler fรผr das โ€žnewListenerโ€œ-Ereignis. Immer wenn ein neuer Eventhandler registriert wird, wird in der Konsole der Text โ€žListener fรผr hinzugefรผgtโ€œ + der Ereignisname angezeigt.
  2. Hier schreiben wir in die Konsole den Text โ€žHinzugefรผgter Listener fรผrโ€œ + den Ereignisnamen fรผr jedes registrierte Ereignis.
  3. Wir definieren zwei Event-Handler fรผr unser Event โ€ždata_receivedโ€œ.

Wenn der obige Code ordnungsgemรครŸ ausgefรผhrt wird, wird der folgende Text in der Konsole angezeigt. Es zeigt lediglich, dass der Ereignishandler โ€žnewListenerโ€œ zweimal ausgelรถst wurde.

Listener fรผr data_received-Ereignisse hinzugefรผgt

Listener fรผr data_received-Ereignisse hinzugefรผgt

Zusammenfassung

  • Streams werden in Node.js verwendet, um Daten von Eingabe-Ausgabe-Gerรคten zu lesen und zu schreiben. Node.js verwendet die Bibliothek โ€žfsโ€œ, um lesbare und beschreibbare Streams fรผr Dateien zu erstellen. Diese Streams kรถnnen zum Lesen und Schreiben von Daten aus Dateien verwendet werden.
  • Rohre kรถnnen verwendet werden, um mehrere Strรถme miteinander zu verbinden. Eines der hรคufigsten Beispiele ist die Zusammenfรผhrung des Lese- und Schreibstroms fรผr die รœbertragung von Daten von einer Datei zur anderen.
  • Node.js wird oft auch als ereignisgesteuertes Framework bezeichnet und es ist sehr einfach, Ereignisse in Node.js zu definieren. Es kรถnnen Funktionen definiert werden, die auf diese Ereignisse reagieren.
  • Ereignisse stellen auch Methoden zur Reaktion auf Schlรผsselereignisse bereit. Wir haben zum Beispiel den Event-Handler Once() gesehen, mit dem sichergestellt werden kann, dass eine Callback-Funktion nur einmal ausgefรผhrt wird, wenn ein Ereignis ausgelรถst wird.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: