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 |