Heim > Web-Frontend > js-Tutorial > Node.js-Streams verstehen: Was, warum und wie man sie verwendet

Node.js-Streams verstehen: Was, warum und wie man sie verwendet

Mary-Kate Olsen
Freigeben: 2024-09-21 06:24:08
Original
379 Leute haben es durchsucht

Understanding Node.js Streams: What, Why, and How to Use Them

Node.js Streams sind eine wesentliche Funktion für den effizienten Umgang mit großen Datenmengen. Im Gegensatz zu herkömmlichen Eingabe-Ausgabe-Mechanismen ermöglichen Streams die Verarbeitung von Daten in Blöcken, anstatt die gesamten Daten in den Speicher zu laden, was sie ideal für den Umgang mit großen Dateien oder Echtzeitdaten macht. In diesem Artikel gehen wir ausführlich darauf ein, was Node.js-Streams sind, warum sie nützlich sind, wie man sie implementiert und welche Arten von Streams es gibt, mit detaillierten Beispielen und Anwendungsfällen.

Was sind Node.js-Streams?

Einfach ausgedrückt ist ein Stream eine Abfolge von Daten, die im Laufe der Zeit von einem Punkt zum anderen verschoben werden. Man kann es sich wie ein Fließband vorstellen, auf dem Daten Stück für Stück und nicht alle auf einmal fließen.

Node.js Streams funktionieren ähnlich; Sie ermöglichen das Lesen und Schreiben von Daten in Blöcken (anstatt alle auf einmal), wodurch sie äußerst speichereffizient sind.

Streams in Node.js basieren auf EventEmitter und sind somit ereignisgesteuert. Einige wichtige Ereignisse sind:

  • Daten: Wird ausgegeben, wenn Daten zum Verbrauch verfügbar sind.
  • Ende: Wird ausgegeben, wenn keine Daten mehr zum Konsumieren verfügbar sind.
  • Fehler: Wird ausgegeben, wenn beim Lesen oder Schreiben ein Fehler auftritt.

Warum Streams verwenden?

Streams bieten mehrere Vorteile gegenüber herkömmlichen Methoden wie fs.readFile() oder fs.writeFile() für die Verarbeitung von E/A:

  1. Speichereffizienz: Sie können sehr große Dateien verarbeiten, ohne viel Speicher zu verbrauchen, da die Daten in Blöcken verarbeitet werden.
  2. Leistung: Streams bieten nicht blockierende E/A. Sie ermöglichen das Stück für Stück das Lesen oder Schreiben von Daten, ohne auf den Abschluss des gesamten Vorgangs warten zu müssen, wodurch das Programm reaktionsschneller wird.
  3. Echtzeit-Datenverarbeitung: Streams ermöglichen die Verarbeitung von Echtzeitdaten wie Live-Video/Audio oder großen Datensätzen von APIs.

Arten von Streams in Node.js

Es gibt vier Arten von Streams in Node.js:

  1. Lesbare Streams: Zum Lesen von Daten.
  2. Schreibbare Streams: Zum Schreiben von Daten.
  3. Duplex-Streams: Streams, die gleichzeitig Daten lesen und schreiben können.
  4. Streams transformieren: Eine Art Duplex-Stream, bei dem die Ausgabe eine modifizierte Version der Eingabe ist (z. B. Datenkomprimierung).

Lassen Sie uns jeden Typ anhand von Beispielen durchgehen.

1. Lesbare Streams

Lesbare Streams werden verwendet, um Daten Stück für Stück zu lesen. Wenn wir beispielsweise eine große Datei lesen, können wir mithilfe eines lesbaren Streams kleine Datenblöcke in den Speicher einlesen, anstatt die gesamte Datei zu laden.

Beispiel: Lesen einer Datei mithilfe eines lesbaren Streams

const fs = require('fs');

// Create a readable stream
const readableStream = fs.createReadStream('largefile.txt', { encoding: 'utf8' });

// Listen for data events and process chunks
readableStream.on('data', (chunk) => {
  console.log('Chunk received:', chunk);
});

// Listen for the end event when no more data is available
readableStream.on('end', () => {
  console.log('No more data.');
});

// Handle error event
readableStream.on('error', (err) => {
  console.error('Error reading the file:', err);
});
Nach dem Login kopieren

Erklärung:

  • fs.createReadStream() erstellt einen Stream, um die Datei in Blöcken zu lesen.
  • Das Datenereignis wird jedes Mal ausgelöst, wenn ein Block bereit ist, und das Endereignis wird ausgelöst, wenn keine Daten mehr zum Lesen vorhanden sind.

2. Beschreibbare Streams

Schreibbare Streams werden verwendet, um Daten Stück für Stück zu schreiben. Anstatt alle Daten auf einmal zu schreiben, können Sie sie in eine Datei oder ein anderes beschreibbares Ziel streamen.

Beispiel: Schreiben von Daten mithilfe eines beschreibbaren Streams

const fs = require('fs');

// Create a writable stream
const writableStream = fs.createWriteStream('output.txt');

// Write chunks to the writable stream
writableStream.write('Hello, World!\n');
writableStream.write('Streaming data...\n');

// End the stream (important to avoid hanging the process)
writableStream.end('Done writing.\n');

// Listen for the finish event
writableStream.on('finish', () => {
  console.log('Data has been written to output.txt');
});

// Handle error event
writableStream.on('error', (err) => {
  console.error('Error writing to the file:', err);
});
Nach dem Login kopieren

Erklärung:

  • fs.createWriteStream() erstellt einen beschreibbaren Stream.
  • Daten werden mit der Methode write() in den Stream geschrieben.
  • Das Finish-Ereignis wird ausgelöst, wenn alle Daten geschrieben sind, und die end()-Methode markiert das Ende des Streams.

3. Duplex-Streams

Duplex-Streams können Daten sowohl lesen als auch schreiben. Ein typisches Beispiel für einen Duplex-Stream ist ein Netzwerk-Socket, an dem Sie gleichzeitig Daten senden und empfangen können.

Beispiel: Duplex-Stream

const { Duplex } = require('stream');

const duplexStream = new Duplex({
  write(chunk, encoding, callback) {
    console.log(`Writing: ${chunk.toString()}`);
    callback();
  },
  read(size) {
    this.push('More data');
    this.push(null);  // End the stream
  }
});

// Write to the duplex stream
duplexStream.write('Hello Duplex!\n');

// Read from the duplex stream
duplexStream.on('data', (chunk) => {
  console.log(`Read: ${chunk}`);
});
Nach dem Login kopieren

Erklärung:

  • Wir definieren eine Schreibmethode zum Schreiben und eine Lesemethode zum Lesen.
  • Duplex-Streams können gleichzeitig Lesen und Schreiben verarbeiten.

4. Streams transformieren

Transformationsstreams ändern die Daten, während sie den Stream durchlaufen. Beispielsweise könnte ein Transformationsstream Daten komprimieren, verschlüsseln oder manipulieren.

Beispiel: Stream transformieren (Text in Großbuchstaben)

const { Transform } = require('stream');

// Create a transform stream that converts data to uppercase
const transformStream = new Transform({
  transform(chunk, encoding, callback) {
    this.push(chunk.toString().toUpperCase());
    callback();
  }
});

// Pipe input to transform stream and then output the result
process.stdin.pipe(transformStream).pipe(process.stdout);
Nach dem Login kopieren

Erklärung:

  • Dateneingaben von stdin werden durch die Transformationsmethode in Großbuchstaben umgewandelt und dann an stdout ausgegeben.

Rohrleitungsströme

Eines der Hauptmerkmale von Node.js-Streams ist ihre Fähigkeit zur Pipeline. Mit Piping können Sie Streams miteinander verketten und die Ausgabe eines Streams als Eingabe an einen anderen weiterleiten.

Beispiel: Weiterleiten eines lesbaren Streams in einen beschreibbaren Stream

const fs = require('fs');

// Create a readable stream for the input file
const readableStream = fs.createReadStream('input.txt');

// Create a writable stream for the output file
const writableStream = fs.createWriteStream('output.txt');

// Pipe the readable stream into the writable stream
readableStream.pipe(writableStream);

// Handle errors
readableStream.on('error', (err) => console.error('Read error:', err));
writableStream.on('error', (err) => console.error('Write error:', err));
Nach dem Login kopieren

Erklärung:

  • Die Methode „pipe()“ verbindet den lesbaren Stream mit dem beschreibbaren Stream und sendet Datenblöcke direkt von input.txt an Output.txt.

Praktische Anwendungsfälle von Node.js-Streams

  1. Große Dateien lesen und schreiben: Anstatt eine ganze Datei in den Speicher einzulesen, können Sie mit Streams die Datei in kleinen Abschnitten verarbeiten.
  2. Echtzeit-Datenverarbeitung: Streams eignen sich ideal für Echtzeitanwendungen wie Audio-/Videoverarbeitung, Chat-Anwendungen oder Live-Daten-Feeds.
  3. HTTP-Anfragen/Antworten: HTTP-Anfragen und -Antworten in Node.js sind Streams, die es einfach machen, eingehende Daten zu verarbeiten oder Daten schrittweise zu senden.

Abschluss

Node.js-Streams bieten eine leistungsstarke und effiziente Möglichkeit, E/A-Vorgänge abzuwickeln, indem sie mit Daten in Blöcken arbeiten. Unabhängig davon, ob Sie große Dateien lesen, Daten zwischen Quellen weiterleiten oder Daten im laufenden Betrieb umwandeln, bieten Streams eine speichereffiziente und leistungsstarke Lösung. Wenn Sie verstehen, wie Sie lesbare, beschreibbare, Duplex- und Transformationsströme in Ihrer Anwendung nutzen können, können Sie die Leistung und Skalierbarkeit Ihrer Anwendung erheblich verbessern.

Das obige ist der detaillierte Inhalt vonNode.js-Streams verstehen: Was, warum und wie man sie verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage