Streams aer sekventiella datastroemmar som hanteras i bitar, vilket moejliggoer effektiv bearbetning av stora filer utan att oeverbelasta minnet.
Översikt över Stream-Typer
| Typ | Riktning | Beskrivning |
|---|---|---|
Readable |
Endast läsning | Källa som data kan läsas och konsumeras från |
Writable |
Endast skrivning | Destination som data kan skrivas till |
Transform |
Läsning och skrivning | Omvandlar eller ändrar data under genomströmning |
Duplex |
Läsning och skrivning | Både läs- och skrivbar med oberoende kanaler (t.ex. TCP-socket) |
Pipeline och moderna stream/promises
Moderna Node.js erbjuder funktionen pipeline foer att koppla ihop stroemmar saekert med automatisk felhantering:
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('Komprimering slutförd');
}
Skapa Anpassade Streams
1. Anpassad Readable Stream
const { Readable } = require('stream');
function createTimestampStream() {
let count = 0;
return new Readable({
objectMode: true,
read() {
if (count >= 5) {
this.push(null); // Slut på strömmen
} else {
this.push({ id: ++count, time: new Date() });
}
}
});
}
2. Anpassad Transform Stream
const { Transform } = require('stream');
const uppercaseTransformer = new Transform({
transform(chunk, encoding, callback) {
const transformed = chunk.toString().toUpperCase();
callback(null, transformed);
}
});
3. Anpassad Writable Stream
const { Writable } = require('stream');
const consoleWriter = new Writable({
objectMode: true,
write(chunk, encoding, callback) {
console.log('Skriver datablock:', chunk);
callback();
}
});
Flowing-läge vs Paused-läge
Läsbara strömmar arbetar i antingen pausat läge (paused) eller flödande läge (flowing):
const stream = fs.createReadStream('data.csv');
// Att lägga till en 'data'-lyssnare aktiverar automatiskt flowing-läget
stream.on('data', (chunk) => {
console.log(`Mottog ${chunk.length} byte`);
});
// Explicit flödeskontroll
stream.pause(); // Pausa händelser tillfälligt
stream.resume(); // Återuppta strömningshändelser
Stream-Händelser
| Händelse | Gäller för | Utlösningsvillkor |
|---|---|---|
data |
Readable |
Utlöses när ett datablock är redo att läsas |
end |
Readable |
Utlöses när det inte finns mer data att läsa |
finish |
Writable |
Utlöses när all skriven data har spolats ut till mottagaren |
error |
All | Utlöses när ett ohanterat fel inträffar i strömmen |
close |
All | Utlöses när den underliggande resursen stängs |