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
Datenkonnektivitรคt
Jasmin verwenden
Schritt 2) Schreiben Sie den entsprechenden Code, der Streams zum Lesen von Daten aus der Datei verwendet.
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:-
- Zuerst mรผssen wir die โfsโ-Module einbinden, die alle zum Erstellen von Streams erforderlichen Funktionen enthalten.
- Als nรคchstes erstellen wir mit der Methode createReadStream einen lesbaren Stream. Als Eingabe geben wir den Speicherort unserer Datei data.txt an.
- 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.
- Wir nehmen jeden Datenblock, der aus dem Datenstrom gelesen wird, und wandeln ihn in einen String um.
- Schlieรlich senden wir die Ausgabe jedes String-konvertierten Blocks an die Konsole.
Ausgang:
- 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.
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:-
- Wir erstellen einen beschreibbaren Stream mithilfe der Methode โ createWriteStream. Als Eingabe geben wir den Speicherort unserer data.txt-Datei an.
- 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.
var fs = require("fs");
var readStream = fs.createReadStream("D://datainput.txt");
var writeStream = fs.createWriteStream("D://dataOutput.txt");
readStream.pipe(writeStream);
Code Erlรคuterung:-
- 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.
- 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.
- 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.
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:-
- Verwenden Sie die Funktion โrequireโ, um das Modul โeventsโ einzubinden. Mit diesem Modul kรถnnen Sie Ereignisse in Node.js erstellen.
- 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.
- 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.
- 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 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.
- 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.
Code Erlรคuterung:-
- 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.
- Hier lรถsen wir manuell das Ereignis โdata_receivedโ aus.
- 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.
- ร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.)
Code Erlรคuterung:-
- Wir definieren einen eventEmitter-Typ, der fรผr die Verwendung der ereignisbezogenen Methoden erforderlich ist.
- Anschlieรend definieren wir ein Objekt namens Emitter, das zur Definition unserer Event-Handler verwendet wird.
- 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.
- 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.
- 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.
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:-
- 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.
- Hier schreiben wir in die Konsole den Text โHinzugefรผgter Listener fรผrโ + den Ereignisnamen fรผr jedes registrierte Ereignis.
- 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.









