Kurzreferenz

Node.js Streams Spickzettel

Ein umfassender Leitfaden fuer Node.js Streams: Readable, Writable, Transform und Duplex Streams, Pipelines, Event-Handling und Flowing-Modus.

· Veröffentlicht

Streams sind Sammlungen von Daten, die stueckweise verarbeitet werden koennen. Dadurch lassen sich grosse Dateien und Netzwerk-Nutzlasten speicherschonend verarbeiten.

Uebersicht der Stream-Typen

Typ Richtung Beschreibung
Readable Nur Lesen Datenquelle, aus der Daten gelesen werden koennen
Writable Nur Schreiben Ziel, in das Daten geschrieben werden koennen
Transform Lesen & Schreiben Transformiert oder modifiziert Daten beim Durchlaufen
Duplex Lesen & Schreiben Sowohl lesbar als auch schreibbar mit unabhaengigen Kanaelen (z. B. TCP-Socket)

Pipelines und modernes stream/promises

Modernes Node.js bietet pipeline, um Streams sicher mit automatischer Fehlerbehandlung und Ressourcenbereinigung zu verknuepfen:

const { pipeline } = require('stream/promises');
const fs = require('fs');
const zlib = require('zlib');

async function compressFile() {
  await pipeline(
    fs.createReadStream('source.tar'),
    zlib.createGzip(),
    fs.createWriteStream('source.tar.gz')
  );
  console.log('Komprimierung abgeschlossen');
}

Benutzerdefinierte Streams erstellen

1. Eigener Readable Stream

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

function createTimestampStream() {
  let count = 0;
  return new Readable({
    objectMode: true,
    read() {
      if (count >= 5) {
        this.push(null); // Ende des Streams
      } else {
        this.push({ id: ++count, time: new Date() });
      }
    }
  });
}

2. Eigener Transform Stream

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

const uppercaseTransformer = new Transform({
  transform(chunk, encoding, callback) {
    const transformed = chunk.toString().toUpperCase();
    callback(null, transformed);
  }
});

3. Eigener Writable Stream

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

const consoleWriter = new Writable({
  objectMode: true,
  write(chunk, encoding, callback) {
    console.log('Schreibe Chunk:', chunk);
    callback();
  }
});

Flowing- vs. Paused-Modus

Lesbare Streams arbeiten entweder im Paused- oder Flowing-Modus:

const stream = fs.createReadStream('data.csv');

// Das Registrieren eines 'data'-Listeners aktiviert automatisch den Flowing-Modus
stream.on('data', (chunk) => {
  console.log(`Empfangen: ${chunk.length} Bytes`);
});

// Explizite Flusssteuerung
stream.pause();  // Ereignisse voruebergehend anhalten
stream.resume(); // Streaming-Ereignisse fortsetzen

Stream-Ereignisse

Ereignis Gilt fuer Ausloesebedingung
data Readable Wird ausgeloest, wenn ein Daten-Chunk verfuegbar ist
end Readable Wird ausgeloest, wenn keine weiteren Daten vorhanden sind
finish Writable Wird ausgeloest, wenn alle geschriebenen Daten uebertragen wurden
error All Wird ausgeloest, wenn ein unbehandelter Fehler auftritt
close All Wird ausgeloest, wenn die zugrundeliegende Ressource geschlossen wird

Referenzen

Verwandte Themen