Γρήγορη αναφορά

Node.js Streams Σημειώσεις

Ένας ολοκληρωμένος οδηγός για τα Node.js Streams: Readable, Writable, Transform και Duplex ροές, piping, διαχείριση συμβάντων και flowing mode.

· Δημοσιεύτηκε

Οι Ροές (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 Εκπέμπεται όταν κλείσει ο υποκείμενος πόρος

Σχετικές Αναφορές

Σχετικά θέματα