Streams zijn gegevensstromen die in stukjes worden verwerkt, waardoor grote bestanden en netwerkdata geheugenefficiënt verwerkt worden.
Overzicht van Stream-Types
| Type | Richting | Beschrijving |
|---|---|---|
Readable |
Alleen-lezen | Bron waaruit gegevens kunnen worden gelezen |
Writable |
Alleen-schrijven | Bestemming waarnaar gegevens kunnen worden geschreven |
Transform |
Lezen & Schrijven | Transformeert of wijzigt gegevens tijdens de doorgang |
Duplex |
Lezen & Schrijven | Zowel lees- als schrijfbaar met onafhankelijke kanalen (bijv. TCP-socket) |
Pipeline en modern stream/promises
Modern Node.js biedt pipeline om streams veilig te koppelen met automatische foutafhandeling en resource-opschoning:
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('Compressie voltooid');
}
Aangepaste Streams Maken
1. Aangepaste Readable Stream
const { Readable } = require('stream');
function createTimestampStream() {
let count = 0;
return new Readable({
objectMode: true,
read() {
if (count >= 5) {
this.push(null); // Einde van stream
} else {
this.push({ id: ++count, time: new Date() });
}
}
});
}
2. Aangepaste Transform Stream
const { Transform } = require('stream');
const uppercaseTransformer = new Transform({
transform(chunk, encoding, callback) {
const transformed = chunk.toString().toUpperCase();
callback(null, transformed);
}
});
3. Aangepaste Writable Stream
const { Writable } = require('stream');
const consoleWriter = new Writable({
objectMode: true,
write(chunk, encoding, callback) {
console.log('Schrijven van chunk:', chunk);
callback();
}
});
Flowing-modus vs Paused-modus
Leesbare streams werken in de gepauzeerde (paused) of vloeiende (flowing) modus:
const stream = fs.createReadStream('data.csv');
// Het toevoegen van een 'data'-listener activeert automatisch de flowing-modus
stream.on('data', (chunk) => {
console.log(`Ontvangen: ${chunk.length} bytes`);
});
// Expliciete stroomregeling
stream.pause(); // Gebeurtenissen tijdelijk pauzeren
stream.resume(); // Streaming-gebeurtenissen hervatten
Stream-Gebeurtenissen
| Gebeurtenis | Van toepassing op | Trigger-voorwaarde |
|---|---|---|
data |
Readable |
Geactiveerd wanneer een stuk gegevens klaar is voor verwerking |
end |
Readable |
Geactiveerd wanneer er geen gegevens meer beschikbaar zijn |
finish |
Writable |
Geactiveerd wanneer alle geschreven gegevens zijn weggeschreven |
error |
All | Geactiveerd bij een niet-afgehandelde streamfout |
close |
All | Geactiveerd wanneer de onderliggende descriptor wordt gesloten |