Οι Ροές (Streams) επιτρέπουν την αποδοτική επεξεργασία μεγάλων αρχείων και δεδομένων δικτύου χωρίς υπερφόρτωση της μνήμης.
Επισκόπηση Τύπων Ροών
| Τύπος | Κατεύθυνση | Περιγραφή |
|---|---|---|
Readable |
Μόνο ανάγνωση | Πηγή από την οποία καταναλώνονται δεδομένα |
Writable |
Μόνο εγγραφή | Προορισμός στον οποίο εγγράφονται δεδομένα |
Transform |
Ανάγνωση & Εγγραφή | Μετασχηματίζει ή τροποποιεί δεδομένα κατά τη διέλευση |
Duplex |
Ανάγνωση & Εγγραφή | Ταυτόχρονα αναγνώσιμο και εγγράψιμο με ανεξάρτητα κανάλια (π.χ. TCP socket) |
Αγωγοί (Pipeline) και σύγχρονο stream/promises
Το σύγχρονο Node.js παρέχει τη συνάρτηση pipeline για ασφαλή σύνδεση ροών με αυτόματη διαχείριση σφαλμάτων:
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('Η συμπίεση ολοκληρώθηκε');
}
Δημιουργία Προσαρμοσμένων Ροών
1. Προσαρμοσμένη Readable Ροή
const { Readable } = require('stream');
function createTimestampStream() {
let count = 0;
return new Readable({
objectMode: true,
read() {
if (count >= 5) {
this.push(null); // Τέλος της ροής
} else {
this.push({ id: ++count, time: new Date() });
}
}
});
}
2. Προσαρμοσμένη Transform Ροή
const { Transform } = require('stream');
const uppercaseTransformer = new Transform({
transform(chunk, encoding, callback) {
const transformed = chunk.toString().toUpperCase();
callback(null, transformed);
}
});
3. Προσαρμοσμένη Writable Ροή
const { Writable } = require('stream');
const consoleWriter = new Writable({
objectMode: true,
write(chunk, encoding, callback) {
console.log('Εγγραφή τμήματος:', chunk);
callback();
}
});
Κατάσταση Flowing έναντι Paused
Οι αναγνώσιμες ροές λειτουργούν είτε σε κατάσταση παύσης (paused) είτε σε κατάσταση συνεχούς ροής (flowing):
const stream = fs.createReadStream('data.csv');
// Η προσθήκη ακροατή 'data' ενεργοποιεί αυτόματα τη λειτουργία flowing
stream.on('data', (chunk) => {
console.log(`Ελήφθησαν ${chunk.length} bytes`);
});
// Ρητός έλεγχος ροής
stream.pause(); // Προσωρινή παύση συμβάντων
stream.resume(); // Συνέχιση συμβάντων ροής
Συμβάντα Ροών
| Συμβάν | Εφαρμόζεται σε | Συνθήκη Πυροδότησης |
|---|---|---|
data |
Readable |
Εκπέμπεται όταν ένα τμήμα δεδομένων είναι έτοιμο |
end |
Readable |
Εκπέμπεται όταν δεν υπάρχουν άλλα διαθέσιμα δεδομένα |
finish |
Writable |
Εκπέμπεται όταν όλα τα δεδομένα έχουν εγγραφεί πλήρως |
error |
All | Εκπέμπεται όταν προκύψει μη διαχειριζόμενο σφάλμα |
close |
All | Εκπέμπεται όταν κλείσει ο υποκείμενος πόρος |