Ροές Node.js: FileStream, Διοχετεύσεις & Συμβάντα

⚡ Έξυπνη Σύνοψη

Οι ροές Node.js διαβάζουν και γράφουν δεδομένα σε μικρά κομμάτια αντί να φορτώνουν ολόκληρα αρχεία στη μνήμη, και αυτή η σελίδα εξηγεί τη δημιουργία ροής αρχείων, την αλυσιδωτή σύνδεση αγωγών, τον χειρισμό της αντίθλιψης και το μοντέλο συμβάντων που διατηρεί την αποτελεσματική μεταφορά δεδομένων μεγάλης κλίμακας.

  • 📖 Τύποι ροής: Το Node.js οργανώνει κάθε ροή ως αναγνώσιμη, εγγράψιμη, διπλής όψης ή μετασχηματισμένη και κάθε API Node.js επιστρέφει έναν από αυτούς τους τέσσερις τύπους.
  • 📂 Ροή αρχείων: Οι συναρτήσεις fs.createReadStream() και fs.createWriteStream() διαβάζουν και γράφουν αρχεία σε τμήματα χωρίς να φορτώνουν ολόκληρο το αρχείο στη μνήμη.
  • 🔗 Piping: Η μέθοδος pipe() συνδέει μια αναγνώσιμη ροή απευθείας με μια εγγράψιμη ροή και μετακινεί δεδομένα μεταξύ τους αυτόματα.
  • ️ Αντιπίεση: Η write() επιστρέφει false όταν το buffer της είναι γεμάτο και το συμβάν drain σηματοδοτεί πότε είναι ασφαλές να συνεχιστεί η εγγραφή.
  • 📡 Ροή συμβάντων: Τα δεδομένα, το τέλος, το σφάλμα και το τέλος σηματοδοτούν τις βασικές στιγμές στον κύκλο ζωής μιας ροής και καθοδηγούν το μεγαλύτερο μέρος του κώδικα χειρισμού ροής.
  • ⚡ Προσαρμοσμένες εκδηλώσεις: Η ενότητα συμβάντων και το EventEmitter επιτρέπουν σε οποιαδήποτε εφαρμογή Node.js να ορίζει, να εκπέμπει και να ακούει τα δικά της συμβάντα με όνομα.
  • ️ Έλεγχος ακροατή: Οι συναρτήσεις once(), listenerCount() και newListener διαχειρίζονται πόσες φορές εκτελείται ένας χειριστής και πώς οι ακροατές tracκεδ.

Τύποι ροών στο Node.js

Κάθε ροή που εκθέτει το Node.js εμπίπτει σε έναν από τους τέσσερις βασικούς τύπους και η γνώση του τύπου που επιστρέφει ένα δεδομένο API εξηγεί πώς συμπεριφέρεται αυτή η ροή πριν από τη σύνταξη οποιουδήποτε κώδικα. Η ενότητα ροής που συνοδεύει το Node.js ορίζει αυτές τις κατηγορίες και τα API αρχείων, δικτύου και συμπίεσης που χρησιμοποιούνται σε όλο αυτό το άρθρο βασίζονται σε αυτές.

Τύπος ροής Κατεύθυνση Δεδομένων Παράδειγμα API Περίπτωση κοινής χρήσης
Readable Μόνο πηγή (δεδομένα ρέουν προς τα έξω) fs.createReadStream() Ανάγνωση αρχείου, λήψη σώματος αιτήματος HTTP
Εγγράψιμο Μόνο προορισμός (ροές δεδομένων) fs.createWriteStream() Εγγραφή αρχείου, αποστολή απόκρισης HTTP
διπλός Και οι δύο κατευθύνσεις, ανεξάρτητα net.Socket (υποδοχή TCP) Αμφίδρομη επικοινωνία δικτύου
Μεταμορφώστε Και στις δύο κατευθύνσεις, τα δεδομένα τροποποιούνται κατά τη μεταφορά zlib.createGzip() Συμπίεση ή κωδικοποίηση δεδομένων στη μέση της αγωγιμότητας

Μια αναγνώσιμη ροή και μια εγγράψιμη ροή είναι τα δύο δομικά στοιχεία που χρησιμοποιούνται σε όλο αυτό το άρθρο. Και τα δύο τροφοδοτούν επίσης ένα Διακομιστής ιστού HTTP στο Node.js. Μια ροή διπλής όψης συνδυάζει και τους δύο ρόλους σε ένα αντικείμενο, ενώ μια ροή μετασχηματισμού είναι μια ροή διπλής όψης της οποίας η έξοδος τροποποιεί την είσοδό της, όπως η συμπίεση gzip που εφαρμόζεται στη μέση της ροής.

Ροή αρχείων στο Node.js

Με τις τέσσερις κατηγορίες ροής που ορίζονται, το υπόλοιπο άρθρο δημιουργεί μια μεταφορά αρχείων χρησιμοποιώντας τα API ροής με δυνατότητα ανάγνωσης και εγγραφής.

Το Node χρησιμοποιεί εκτενώς τις ροές ως μηχανισμό μεταφοράς δεδομένων.

Για παράδειγμα, όταν εξάγετε οτιδήποτε στην κονσόλα χρησιμοποιώντας τη συνάρτηση console.log, στην πραγματικότητα χρησιμοποιείτε μια ροή για να στείλετε τα δεδομένα στην κονσόλα.

Το Node.js έχει επίσης τη δυνατότητα ροής δεδομένων από αρχεία, ώστε να μπορούν να διαβαστούν και να γραφτούν κατάλληλα. Θα δούμε τώρα ένα παράδειγμα για το πώς μπορούμε να χρησιμοποιήσουμε ροές για ανάγνωση και εγγραφή από αρχεία. Πρέπει να ακολουθήσουμε τα παρακάτω βήματα για αυτό το παράδειγμα

Βήμα 1) Δημιουργήστε ένα αρχείο που ονομάζεται data.txt το οποίο έχει τα παρακάτω δεδομένα. Ας υποθέσουμε ότι αυτό το αρχείο είναι αποθηκευμένο στη μονάδα D του τοπικού μας υπολογιστή.

Εκμάθηση στο Node.js

Εισαγωγή

Εκδηλώσεις

Generators

Συνδεσιμότητα δεδομένων

Χρήση Jasmine

Βήμα 2) Γράψτε τον σχετικό κώδικα που θα κάνει χρήση ροών για την ανάγνωση δεδομένων από το αρχείο.

Ροή αρχείων στο Node.js

var fs = require("fs");
var stream;
stream = fs.createReadStream("D://data.txt");

stream.on("data", function(data) {
    var chunk = data.toString();
    console.log(chunk);
}); 

Code Εξήγηση:-

  1. Πρώτα πρέπει να συμπεριλάβουμε τις ενότητες 'fs' που περιέχουν όλες τις λειτουργίες που απαιτούνται για τη δημιουργία ροών.
  2. Στη συνέχεια δημιουργούμε μια αναγνώσιμη ροή χρησιμοποιώντας τη μέθοδο – createReadStream. Ως είσοδο, δίνουμε τη θέση του αρχείου data.txt μας.
  3. Η συνάρτηση steam.on είναι ένας χειριστής συμβάντων και σε αυτήν, καθορίζουμε την πρώτη παράμετρο ως 'δεδομένα'. Αυτό σημαίνει ότι κάθε φορά που έρχονται δεδομένα στη ροή από το αρχείο, τότε εκτελέστε μια συνάρτηση επανάκλησης. Στην περίπτωσή μας, ορίζουμε μια συνάρτηση επανάκλησης που θα εκτελεί 2 βασικά βήματα. Το πρώτο είναι να μετατρέψετε τα δεδομένα που διαβάζονται από το αρχείο ως συμβολοσειρά. Το δεύτερο θα ήταν να στείλετε τη συμβολοσειρά που μετατράπηκε ως έξοδο στην κονσόλα.
  4. Παίρνουμε κάθε κομμάτι δεδομένων που διαβάζεται από τη ροή δεδομένων και το μετατρέπουμε σε συμβολοσειρά.
  5. Τέλος, στέλνουμε την έξοδο κάθε κομματιού συμβολοσειράς που έχει μετατραπεί στην κονσόλα.

Παραγωγή:

Ροή αρχείων στο Node.js

  • Εάν ο κώδικας εκτελεστεί σωστά, θα δείτε την παραπάνω έξοδο στην κονσόλα. Αυτή η έξοδος θα είναι ίδια με αυτή στο αρχείο data.txt.

Εγγραφή σε αρχείο

Με τον ίδιο τρόπο, που δημιουργούμε μια ροή ανάγνωσης, μπορούμε επίσης να δημιουργήσουμε μια ροή εγγραφής για την εγγραφή δεδομένων σε ένα αρχείο. Ας δημιουργήσουμε πρώτα ένα κενό αρχείο χωρίς περιεχόμενο που ονομάζεται data.txt. Ας υποθέσουμε ότι αυτό το αρχείο είναι τοποθετημένο στη μονάδα δίσκου D του υπολογιστή μας.

Ο παρακάτω κώδικας δείχνει πώς μπορούμε να γράψουμε δεδομένα στο αρχείο.

Ροή αρχείων στο Node.js

var fs = require("fs");
var stream;
stream = fs.createWriteStream("D://data.txt");

stream.write("Tutorial on Node.js")
stream.write("Introduction")
stream.write("Events")
stream.write("Generators")
stream.write("Data Connectivity")
stream.write("Using Jasmine") 

Code Εξήγηση:-

  1. Δημιουργούμε μια εγγράψιμη ροή χρησιμοποιώντας τη μέθοδο – createWriteStream. Ως είσοδο, δίνουμε τη θέση του αρχείου data.txt μας.
  2. Στη συνέχεια χρησιμοποιήσαμε τη μέθοδο stream.write για να γράψουμε τις διαφορετικές γραμμές κειμένου στο αρχείο κειμένου μας. Η ροή θα φροντίσει να εγγράψει αυτά τα δεδομένα στο αρχείο data.txt.

Εάν ανοίξετε το αρχείο data.txt, θα δείτε τώρα τα ακόλουθα δεδομένα στο αρχείο

Εκμάθηση στο Node.js

Εισαγωγή

Εκδηλώσεις

Generators

Συνδεσιμότητα δεδομένων

Χρησιμοποιώντας Γιασεμί

Σωλήνες στο Node.js

Η ανεξάρτητη ανάγνωση και εγγραφή ροών είναι χρήσιμη, αλλά το Node.js επιτρέπει επίσης σε μια αναγνώσιμη ροή να συνδέεται απευθείας με μια εγγράψιμη ροή, μετακινώντας δεδομένα χωρίς χειροκίνητη αποθήκευση κώδικα buffering.

Μέσα στις εφαρμογές Node, οι ροές μπορούν να διοχετεύονται μαζί χρησιμοποιώντας τη μέθοδο pipe(), η οποία παίρνει δύο ορίσματα:

  • Μια Απαιτούμενη εγγράψιμη ροή που λειτουργεί ως προορισμός για τα δεδομένα και
  • Ένα προαιρετικό αντικείμενο που χρησιμοποιείται για να περάσει στις επιλογές.

Χαρακτηριστικό παράδειγμα χρήσης σωλήνων, εάν θέλετε να μεταφέρετε δεδομένα από το ένα αρχείο στο άλλο.

Ας δούμε λοιπόν ένα παράδειγμα για το πώς μπορούμε να μεταφέρουμε δεδομένα από το ένα αρχείο στο άλλο χρησιμοποιώντας σωλήνες.

Βήμα 1) Δημιουργήστε ένα αρχείο που ονομάζεται datainput.txt το οποίο έχει τα παρακάτω δεδομένα. Ας υποθέσουμε ότι αυτό το αρχείο είναι αποθηκευμένο στη μονάδα D του τοπικού μας υπολογιστή.

Εκμάθηση στο Node.js

Εισαγωγή

Εκδηλώσεις

Generators

Συνδεσιμότητα δεδομένων

Χρήση Jasmine

Βήμα 2) Δημιουργήστε ένα κενό κενό αρχείο που ονομάζεται dataOutput.txt και τοποθετήστε το στη μονάδα δίσκου D του τοπικού σας υπολογιστή.

Βήμα 3) Γράψτε τον παρακάτω κώδικα για να πραγματοποιήσετε τη μεταφορά δεδομένων από το αρχείο datainput.txt στο αρχείο dataOutput.txt.

Σωλήνες στο Node.js

var fs = require("fs");
var readStream = fs.createReadStream("D://datainput.txt");
var writeStream = fs.createWriteStream("D://dataOutput.txt");
readStream.pipe(writeStream);

Code Εξήγηση:-

  1. Δημιουργούμε πρώτα μια "readstream" στο αρχείο datainput.txt που περιέχει όλα τα δεδομένα μας που πρέπει να μεταφερθούν στο νέο αρχείο.
  2. Στη συνέχεια, πρέπει να δημιουργήσουμε ένα «writestream» στο αρχείο dataOutput.txt, το οποίο είναι το κενό μας αρχείο και είναι ο προορισμός για τη μεταφορά δεδομένων από το αρχείο datainput.txt.
  3. Στη συνέχεια χρησιμοποιούμε την εντολή pipe για να μεταφέρουμε τα δεδομένα από τη ροή ανάγνωσης στη ροή εγγραφής. Η εντολή pipe θα λάβει όλα τα δεδομένα που έρχονται στη ροή ανάγνωσης και θα τα ωθήσει στη ροή εγγραφής.

Εάν ανοίξετε τώρα το αρχείο dataOutput.txt, θα δείτε όλα τα δεδομένα που υπήρχαν στο αρχείο datainput.txt.

Ροή συμβάντων και αντίστροφη πίεση στο Node.js

Η κλήση της συνάρτησης pipe(), όπως φαίνεται παραπάνω, κρύβει δύο μηχανισμούς που έχουν σημασία σε κλίμακα: τα γεγονότα που εκπέμπει κάθε ροή και το σύστημα αντίθλιψης που εμποδίζει μια γρήγορη πηγή να κατακλύσει έναν αργό προορισμό.

  • δεδομένα: που εκπέμπεται από μια αναγνώσιμη ροή κάθε φορά που είναι διαθέσιμο ένα νέο κομμάτι.
  • τέλος: που εκπέμπεται μόλις μια αναγνώσιμη ροή παραδώσει το τελευταίο της κομμάτι.
  • φινίρισμα: που εκπέμπεται από μια εγγράψιμη ροή μόλις εκκαθαριστούν όλα τα δεδομένα που βρίσκονται στην ουρά.
  • λάθος: εκπέμπεται από οποιονδήποτε τύπο ροής σε περίπτωση αποτυχίας. Να το χειρίζεστε πάντα, διαφορετικά η διεργασία καταρρέει.

Το παρακάτω παράδειγμα ακούει και τα τέσσερα συμβάντα ενώ διαχειρίζεται χειροκίνητα την αντίθλιψη, την ίδια συμπεριφορά που παρέχει αυτόματα η συνάρτηση pipe().

var fs = require("fs");
var readStream = fs.createReadStream("D://data.txt");
var writeStream = fs.createWriteStream("D://dataOutput.txt");

readStream.on("data", function(chunk) {
    var ok = writeStream.write(chunk);
    if (!ok) {
        readStream.pause();
    }
});

writeStream.on("drain", function() {
    readStream.resume();
});

readStream.on("end", function() {
    writeStream.end();
});

writeStream.on("finish", function() {
    console.log("Write completed.");
});

readStream.on("error", function(err) {
    console.log(err);
});

Η αντίθλιψη συμβαίνει όταν μια αναγνώσιμη ροή παράγει δεδομένα ταχύτερα από ό,τι μια εγγράψιμη ροή μπορεί να τα καταναλώσει. Η μέθοδος write() επιστρέφει false μόλις γεμίσει το buffer της, επομένως ο παραπάνω κώδικας θέτει σε παύση την πηγή μέχρι ο προορισμός να εκπέμψει ένα συμβάν drain, σηματοδοτώντας ότι είναι ασφαλής η συνέχιση. Η pipe() εκτελεί αυτόν τον κύκλο αυτόματα.

⚠ Συμβουλή: Στην παραγωγή, προτιμήστε τη συνάρτηση pipeline() από τη λειτουργική μονάδα ροής αντί για μια χειροκίνητη αλυσίδα pipe(), καθώς προωθεί σφάλματα από κάθε ροή και κλείνει αυτόματα τους χειρισμούς αρχείων.

Συμβάντα στο Node.js

Τα streams αποτελούν ένα παράδειγμα του ευρύτερου σχεδιασμού που βασίζεται σε συμβάντα του Node.js. Το υπόλοιπο άρθρο εξετάζει τον τρόπο λειτουργίας των συμβάντων γενικά, χρησιμοποιώντας την ίδια κλάση EventEmitter στην οποία βασίζονται εσωτερικά τα streams.

Τα συμβάντα είναι μία από τις βασικές έννοιες στο Node.js και μερικές φορές το Node.js αναφέρεται ως πλαίσιο που βασίζεται σε συμβάντα.

Βασικά, ένα γεγονός είναι κάτι που συμβαίνει. Για παράδειγμα, εάν δημιουργηθεί μια σύνδεση με μια βάση δεδομένων, τότε ενεργοποιείται το συμβάν σύνδεσης βάσης δεδομένων. Ο προγραμματισμός βάσει συμβάντων είναι να δημιουργήσει συναρτήσεις που θα ενεργοποιούνται όταν ενεργοποιούνται συγκεκριμένα συμβάντα.

Ας δούμε ένα βασικό παράδειγμα καθορισμού ενός συμβάντος στο Node.js.

Θα δημιουργήσουμε ένα συμβάν που ονομάζεται 'data_received'. Όταν ενεργοποιηθεί αυτό το συμβάν, το κείμενο "δεδομένα ελήφθησαν" θα σταλεί στην κονσόλα.

Συμβάντα στο Node.js

var events = require('events');
var eventEmitter = new events.EventEmitter();
eventEmitter.on('data_received', function() {
    console.log('data received succesfully.');
});

eventEmitter.emit('data_received'); 

Code Εξήγηση:-

  1. Χρησιμοποιήστε τη συνάρτηση απαίτησης για να συμπεριλάβετε τη λειτουργική μονάδα «συμβάντα». Με αυτήν την ενότητα, θα μπορείτε να δημιουργήσετε συμβάντα στο Node.js.
  2. Δημιουργήστε έναν νέο πομπό συμβάντων. Αυτό χρησιμοποιείται για τη σύνδεση του συμβάντος, το οποίο στην περίπτωσή μας είναι "data_received" σε μια συνάρτηση επανάκλησης που ορίζεται στο βήμα 3.
  3. Ορίζουμε μια συνάρτηση που βασίζεται σε συμβάν που λέει ότι εάν σε περίπτωση που ενεργοποιηθεί το συμβάν "data_received", τότε θα πρέπει να εξάγουμε το κείμενο "data_received" στην κονσόλα.
  4. Τέλος, έχουμε μια μη αυτόματη ενεργοποίηση του συμβάντος μας χρησιμοποιώντας τη συνάρτηση eventEmiter.emit. Αυτό θα ενεργοποιήσει το συμβάν data_received.

Όταν εκτελείται το πρόγραμμα, το κείμενο «δεδομένα ελήφθησαν» θα σταλεί στην κονσόλα όπως φαίνεται παρακάτω.

Συμβάντα στο Node.js

Εκπομπή Γεγονότων

Πέρα από την εκπομπή και την ακρόαση συμβάντων, το Node.js αποκαλύπτει επιπλέον μεθόδους για τον έλεγχο του τρόπου εγγραφής και επιθεώρησης των ακροατών.

Κατά τον ορισμό συμβάντων, υπάρχουν διαφορετικές μέθοδοι για συμβάντα που μπορούν να κληθούν. Αυτό το θέμα εστιάζει στην εξέταση καθενός από αυτά λεπτομερώς.

  1. Χειριστές συμβάντων μιας φοράς

Μερικές φορές μπορεί να σας ενδιαφέρει να αντιδράσετε σε ένα γεγονός μόνο την πρώτη φορά που θα συμβεί. Σε αυτές τις περιπτώσεις, μπορείτε να χρησιμοποιήσετε τη μέθοδο Once().

Ας δούμε πώς μπορούμε να χρησιμοποιήσουμε τη μέθοδο μιας φοράς για χειριστές συμβάντων.

Εκπομπή Γεγονότων

Code Εξήγηση:-

  1. Εδώ χρησιμοποιούμε τη μέθοδο 'one' για να πούμε ότι για το συμβάν 'data_received', η συνάρτηση επανάκλησης πρέπει να εκτελείται μόνο μία φορά.
  2. Εδώ ενεργοποιούμε με μη αυτόματο τρόπο το συμβάν 'data_received'.
  3. Όταν ενεργοποιηθεί ξανά το συμβάν 'data_received', αυτή τη φορά, δεν θα συμβεί τίποτα. Αυτό οφείλεται στο πρώτο βήμα όπου είπαμε ότι το συμβάν θα μπορούσε να ενεργοποιηθεί μόνο μία φορά.

Εάν ο κώδικας εκτελεστεί σωστά, η έξοδος στο αρχείο καταγραφής θα είναι "data_received επιτυχώς". Αυτό το μήνυμα θα εμφανιστεί μόνο μία φορά στην κονσόλα.

  1. Επιθεώρηση Ακροατών Εκδηλώσεων

Σε οποιοδήποτε σημείο της ζωής του, ένας εκπομπός συμβάντων μπορεί να έχει μηδέν ή περισσότερους ακροατές συνδεδεμένους με αυτόν. Οι ακροατές για κάθε τύπο συμβάντος μπορούν να επιθεωρηθούν με διάφορους τρόπους.

Εάν ενδιαφέρεστε να προσδιορίσετε μόνο τον αριθμό των συνδεδεμένων ακροατών, τότε μην ψάξετε περισσότερο από τη μέθοδο EventEmitter.listenerCount().

(Σημείωση: Οι ακροατές είναι σημαντικοί επειδή το κύριο πρόγραμμα πρέπει να γνωρίζει εάν προστίθενται ακροατές εν κινήσει σε μια εκδήλωση, διαφορετικά το πρόγραμμα θα δυσλειτουργήσει επειδή θα κληθούν επιπλέον ακροατές.)

Εκπομπή Γεγονότων

Code Εξήγηση:-

  1. Ορίζουμε έναν τύπο eventEmitter που απαιτείται για τη χρήση των μεθόδων που σχετίζονται με συμβάντα.
  2. Στη συνέχεια, ορίζουμε ένα αντικείμενο που ονομάζεται εκπομπός που θα χρησιμοποιηθεί για τον ορισμό των χειριστών συμβάντων.
  3. Δημιουργούμε 2 χειριστές συμβάντων που ουσιαστικά δεν κάνουν τίποτα. Αυτό παραμένει απλό για το παράδειγμά μας για να δείξουμε πώς λειτουργεί η μέθοδος listenerCount.
  4. Τώρα, όταν καλείτε τη μέθοδο listenerCount στο συμβάν data_received, θα στείλει τον αριθμό των ακροατών συμβάντων που είναι συνδεδεμένοι σε αυτό το συμβάν στο αρχείο καταγραφής της κονσόλας.

Εάν ο κώδικας εκτελεστεί σωστά, η τιμή 2 θα εμφανιστεί στο αρχείο καταγραφής της κονσόλας.

  1. Η εκδήλωση newListener

Κάθε φορά που καταχωρείται ένας νέος χειριστής συμβάντων, ο εκπομπός συμβάντων εκπέμπει ένα συμβάν newListener. Αυτό το συμβάν χρησιμοποιείται για τον εντοπισμό νέων χειριστών συμβάντων. Συνήθως χρησιμοποιείτε το συμβάν newListener όταν χρειάζεται να εκχωρήσετε πόρους ή να εκτελέσετε κάποια ενέργεια για κάθε νέο πρόγραμμα χειρισμού συμβάντων.

Εκπομπή Γεγονότων

var events = require('events');
var eventEmitter = events.EventEmitter;
var emitter = new eventEmitter();
emitter.on("newListener", function(eventName, listener) {
    console.log("Added listener for " + eventName + " events");
});
emitter.on('data_received', function() {});
emitter.on('data_received', function() {}); 

Code Εξήγηση:-

  1. Δημιουργούμε ένα νέο πρόγραμμα χειρισμού συμβάντων για το συμβάν "newListener". Έτσι, κάθε φορά που καταχωρείται ένας νέος χειριστής συμβάντων, το κείμενο "Προστέθηκε πρόγραμμα ακρόασης για" + το όνομα του συμβάντος θα εμφανίζεται στην κονσόλα.
  2. Εδώ γράφουμε στην κονσόλα το κείμενο "Added listener for" + το όνομα συμβάντος για κάθε συμβάν που έχει καταχωρηθεί.
  3. Ορίζουμε 2 χειριστές συμβάντων για το συμβάν μας 'data_received'.

Εάν ο παραπάνω κώδικας εκτελεστεί σωστά, το παρακάτω κείμενο θα εμφανιστεί στην κονσόλα. Απλώς δείχνει ότι ο χειριστής συμβάντων "newListener" ενεργοποιήθηκε δύο φορές.

Προστέθηκε πρόγραμμα ακρόασης για συμβάντα data_received

Προστέθηκε πρόγραμμα ακρόασης για συμβάντα data_received

Συχνές Ερωτήσεις

Η συνάρτηση fs.readFile() φορτώνει ένα ολόκληρο αρχείο στη μνήμη πριν το επιστρέψει, ενώ η συνάρτηση fs.createReadStream() παραδίδει το αρχείο σε μικρά κομμάτια καθώς αυτά φτάνουν. Οι ροές χρησιμοποιούν πολύ λιγότερη μνήμη για μεγάλα αρχεία και αφήνουν την επεξεργασία να ξεκινήσει πριν ολοκληρωθεί η ανάγνωση.

Ναι. Καλέστε τη συνάρτηση .pipe() μία φορά ανά προορισμό, όπως readStream.pipe(destinationA) ακολουθούμενη από readStream.pipe(destinationB). Το Node.js παραδίδει τα ίδια κομμάτια σε κάθε προορισμό και κάθε εγγράψιμη ροή εξακολουθεί να διαχειρίζεται τη δική της αντίστροφη πίεση ανεξάρτητα.

Ναι. Διοχετεύστε μια αναγνώσιμη ροή μέσω μιας ροής μετασχηματισμού όπως η zlib.createGzip() και, στη συνέχεια, σε μια εγγράψιμη ροή: readStream.pipe(zlib.createGzip()).pipe(writeStream). Το αρχείο συμπιέζεται καθώς ρέει, χωρίς ποτέ να φορτωθεί ολόκληρο το αρχείο στη μνήμη.

Μπορούν να συντάξουν γρήγορα λειτουργικό readStream και boilerplate, αλλά συχνά παραλείπουν τον χειριστή συμβάντων σφάλματος και τον χειρισμό αντίθλιψης. Να ελέγχετε πάντα τον κώδικα ροής που δημιουργείται από τεχνητή νοημοσύνη για και τα δύο κενά πριν τον χρησιμοποιήσετε στην παραγωγή.

Μπορούν να προτείνουν πιθανές αιτίες, όπως μια έλλειψη ακρόασης drain ή ένα ανεπίλυτο συμβάν σφάλματος, αλλά η επιβεβαίωση της πραγματικής αιτίας απαιτεί ακόμα τον χειροκίνητο έλεγχο της κατάστασης της ροής και των αρχείων καταγραφής της εφαρμογής.

Συνοψίστε αυτήν την ανάρτηση με: