Node js Streams Tutorial: Filestream, Pipes

Filestream u Node.js

Node u velikoj mjeri koristi streamove kao mehanizam prijenosa podataka.

Na primjer, kada ispisujete bilo ลกto na konzolu pomoฤ‡u funkcije console.log, zapravo koristite tok za slanje podataka na konzolu.

Node.js takoฤ‘er ima moguฤ‡nost strujanja podataka iz datoteka tako da se mogu ฤitati i pisati na odgovarajuฤ‡i naฤin. Sada ฤ‡emo pogledati primjer kako moลพemo koristiti tokove za ฤitanje i pisanje iz datoteka. Moramo slijediti dolje navedene korake za ovaj primjer

Korak 1) Napravite datoteku pod nazivom data.txt koja sadrลพi podatke ispod. Pretpostavimo da je ova datoteka pohranjena na D disku naลกeg lokalnog stroja.

Vodiฤ za Node.js

Uvod

Dogaฤ‘aji

Generators

Podatkovna povezanost

Koriลกtenje Jasmina

Korak 2) Napiลกite odgovarajuฤ‡i kod koji ฤ‡e koristiti streamove za ฤitanje podataka iz datoteke.

Filestream u 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 Obrazloลพenje:-

  1. Najprije moramo ukljuฤiti 'fs' module koji sadrลพe sve funkcije potrebne za stvaranje tokova.
  2. Zatim stvaramo ฤitljiv stream pomoฤ‡u metode โ€“ createReadStream. Kao unos dajemo lokaciju naลกe datoteke data.txt.
  3. Funkcija steam.on je rukovatelj dogaฤ‘ajima iu njoj navodimo prvi parametar kao 'podatke'. To znaฤi da svaki put kada podaci doฤ‘u u tok iz datoteke, izvrลกite funkciju povratnog poziva. U naลกem sluฤaju, definiramo funkciju povratnog poziva koja ฤ‡e izvrลกiti 2 osnovna koraka. Prvi je pretvoriti podatke proฤitane iz datoteke u niz. Drugi bi bio slanje pretvorenog niza kao izlaz na konzolu.
  4. Uzimamo svaki dio podataka koji se ฤita iz toka podataka i pretvaramo ga u niz.
  5. Konaฤno, ลกaljemo izlaz svakog niza pretvorenog dijela na konzolu.

Izlaz:

Filestream u Node.js

  • Ako se kรดd ispravno izvede, vidjet ฤ‡ete gornji izlaz u konzoli. Ovaj izlaz ฤ‡e biti isti kao onaj u datoteci data.txt.

Zapisivanje u datoteku

Na isti naฤin na koji stvaramo tok za ฤitanje, moลพemo takoฤ‘er stvoriti tok za pisanje za pisanje podataka u datoteku. Kreirajmo prvo praznu datoteku bez sadrลพaja pod nazivom data.txt. Pretpostavimo da je ova datoteka smjeลกtena na D pogon naลกeg raฤunala.

Donji kod pokazuje kako moลพemo pisati podatke u datoteku.

Filestream u 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 Obrazloลพenje:-

  1. Kreiramo tok koji se moลพe pisati koriลกtenjem metode โ€“ createWriteStream. Kao unos dajemo lokaciju naลกe datoteke data.txt.
  2. Zatim smo upotrijebili metodu stream.write za pisanje razliฤitih redaka teksta u naลกu tekstualnu datoteku. Stream ฤ‡e se pobrinuti za pisanje ovih podataka u datoteku data.txt.

Ako otvorite datoteku data.txt, vidjet ฤ‡ete sljedeฤ‡e podatke u datoteci

Vodiฤ za Node.js

Uvod

Dogaฤ‘aji

Generators

Podatkovna povezanost

Koriลกtenje Jasmin

Cijevi u Node.js

Unutar Node aplikacija, tokovi se mogu spojiti zajedno pomoฤ‡u metode pipe(), koja uzima dva argumenta:

  • Potreban tok za pisanje koji sluลพi kao odrediลกte za podatke i
  • Neobavezni objekt koji se koristi za prosljeฤ‘ivanje opcija.

Tipiฤan primjer koriลกtenja cijevi, ako ลพelite prenijeti podatke iz jedne datoteke u drugu.

Dakle, pogledajmo primjer kako moลพemo prenijeti podatke iz jedne datoteke u drugu pomoฤ‡u cijevi.

Korak 1) Napravite datoteku pod nazivom datainput.txt koja sadrลพi podatke u nastavku. Pretpostavimo da je ova datoteka pohranjena na D disku naลกeg lokalnog stroja.

Vodiฤ za Node.js

Uvod

Dogaฤ‘aji

Generators

Podatkovna povezanost

Koriลกtenje Jasmina

Korak 2) Napravite praznu praznu datoteku pod nazivom dataOutput.txt i stavite je na D pogon vaลกeg lokalnog raฤunala.

Korak 3) Napiลกite kod u nastavku da biste izvrลกili prijenos podataka iz datoteke datainput.txt u datoteku dataOutput.txt.

Cijevi u Node.js

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

Code Obrazloลพenje:-

  1. Prvo stvaramo "readstream" za naลกu datainput.txt datoteku koja sadrลพi sve naลกe podatke koje je potrebno prenijeti u novu datoteku.
  2. Zatim trebamo stvoriti "writestream" u naลกu datoteku dataOutput.txt, koja je naลกa prazna datoteka i odrediลกte je za prijenos podataka iz datoteke datainput.txt.
  3. Zatim koristimo naredbu pipe za prijenos podataka iz toka ฤitanja u tok pisanja. Naredba cijevi ฤ‡e uzeti sve podatke koji dolaze u tok ฤitanja i gurnuti ih u tok pisanja.

Ako sada otvorite datoteku dataOutput.txt, vidjet ฤ‡ete sve podatke koji su bili prisutni u datoteci dataOutput.txt.

Dogaฤ‘aji u Node.js

Dogaฤ‘aji su jedan od kljuฤnih koncepata u Node.js i ponekad se Node.js naziva okvirom voฤ‘enim dogaฤ‘ajima.

U osnovi, dogaฤ‘aj je neลกto ลกto se dogaฤ‘a. Na primjer, ako se uspostavi veza s bazom podataka, tada se pokreฤ‡e dogaฤ‘aj povezivanja s bazom podataka. Programiranje voฤ‘eno dogaฤ‘ajima je stvaranje funkcija koje ฤ‡e se pokrenuti kada se pokrenu odreฤ‘eni dogaฤ‘aji.

Pogledajmo osnovni primjer definiranja dogaฤ‘aja u Node.js.

Kreirat ฤ‡emo dogaฤ‘aj pod nazivom 'data_received'. Kada se ovaj dogaฤ‘aj pokrene, tekst "podaci su primljeni" bit ฤ‡e poslan na konzolu.

Dogaฤ‘aji u 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 Obrazloลพenje:-

  1. Upotrijebite funkciju require za ukljuฤivanje modula 'dogaฤ‘aji'. Pomoฤ‡u ovog modula moฤ‡i ฤ‡ete kreirati dogaฤ‘aje u Node.js.
  2. Stvorite novi emiter dogaฤ‘aja. Ovo se koristi za vezanje dogaฤ‘aja, koji je u naลกem sluฤaju "data_received" na funkciju povratnog poziva koja je definirana u koraku 3.
  3. Definiramo funkciju voฤ‘enu dogaฤ‘ajima koja kaลพe da ako se pokrene dogaฤ‘aj "data_received", tada bismo trebali poslati tekst "data_received" na konzolu.
  4. Konaฤno, imamo ruฤni okidaฤ naลกeg dogaฤ‘aja pomoฤ‡u funkcije eventEmiter.emit. To ฤ‡e pokrenuti dogaฤ‘aj data_received.

Kada se program pokrene, tekst "podaci su primljeni" bit ฤ‡e poslan na konzolu kao ลกto je prikazano u nastavku.

Dogaฤ‘aji u Node.js

Emitirajuฤ‡i dogaฤ‘aji

Prilikom definiranja dogaฤ‘aja postoje razliฤite metode za dogaฤ‘aje koje je moguฤ‡e pozvati. Ova se tema fokusira na detaljno razmatranje svakog od njih.

  1. Rukovatelji jednokratnim dogaฤ‘ajima

Ponekad ฤ‡ete moลพda biti zainteresirani reagirati na dogaฤ‘aj tek kad se prvi put dogodi. U tim situacijama moลพete koristiti metodu once().

Pogledajmo kako se moลพemo posluลพiti jednom metodom za rukovatelje dogaฤ‘ajima.

Emitirajuฤ‡i dogaฤ‘aji

Code Obrazloลพenje:-

  1. Ovdje koristimo metodu 'jednom' kako bismo rekli da se za dogaฤ‘aj 'data_received' funkcija povratnog poziva treba izvrลกiti samo jednom.
  2. Ovdje ruฤno pokreฤ‡emo dogaฤ‘aj 'data_received'.
  3. Kada se dogaฤ‘aj 'data_received' ponovo pokrene, ovaj put se niลกta neฤ‡e dogoditi. To je zbog prvog koraka u kojem smo rekli da se dogaฤ‘aj moลพe pokrenuti samo jednom.

Ako se kรดd ispravno izvede, izlaz u dnevniku bit ฤ‡e "data_received successfully". Ova poruka ฤ‡e se pojaviti samo jednom u konzoli.

  1. Provjera sluลกatelja dogaฤ‘aja

U bilo kojem trenutku svog ลพivotnog vijeka emiter dogaฤ‘aja moลพe imati nula ili viลกe sluลกatelja pridruลพenih sebi. Sluลกatelji za svaku vrstu dogaฤ‘aja mogu se pregledati na nekoliko naฤina.

Ako vas zanima samo odreฤ‘ivanje broja priloลพenih sluลกatelja, ne traลพite dalje od metode EventEmitter.listenerCount().

(Biljeลกka: Sluลกatelji su vaลพni jer bi glavni program trebao znati dodaju li se sluลกatelji u hodu u dogaฤ‘aj, inaฤe ฤ‡e program pokvariti jer ฤ‡e biti pozvani dodatni sluลกatelji.)

Emitirajuฤ‡i dogaฤ‘aji

Code Obrazloลพenje:-

  1. Definiramo tip eventEmitter koji je potreban za koriลกtenje metoda povezanih s dogaฤ‘ajima.
  2. Zatim definiramo objekt koji se zove emiter koji ฤ‡e se koristiti za definiranje naลกih rukovatelja dogaฤ‘ajima.
  3. Stvaramo 2 rukovatelja dogaฤ‘ajima koji u osnovi ne rade niลกta. Ovo je jednostavno za naลก primjer samo da pokaลพe kako metoda listenerCount radi.
  4. Sada kada pozovete metodu listenerCount na naลกem dogaฤ‘aju data_received, ona ฤ‡e poslati broj sluลกatelja dogaฤ‘aja priloลพenih ovom dogaฤ‘aju u zapisnik konzole.

Ako se kรดd ispravno izvede, vrijednost 2 bit ฤ‡e prikazana u zapisniku konzole.

  1. Dogaฤ‘aj newListener

Svaki put kada se registrira novi rukovatelj dogaฤ‘ajima, emiter dogaฤ‘aja emitira dogaฤ‘aj newListener. Ovaj se dogaฤ‘aj koristi za otkrivanje novih rukovatelja dogaฤ‘ajima. Dogaฤ‘aj newListener obiฤno koristite kada trebate dodijeliti resurse ili izvrลกiti neku radnju za svaki novi rukovatelj dogaฤ‘ajima.

Emitirajuฤ‡i dogaฤ‘aji

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 Obrazloลพenje:-

  1. Stvaramo novi rukovatelj dogaฤ‘ajima za dogaฤ‘aj 'newListener'. Dakle, kad god se registrira novi rukovatelj dogaฤ‘ajima, na konzoli ฤ‡e se prikazati tekst "Dodan sluลกatelj za" + naziv dogaฤ‘aja.
  2. Ovdje upisujemo na konzolu tekst โ€œDodan sluลกatelj zaโ€ + naziv dogaฤ‘aja za svaki registrirani dogaฤ‘aj.
  3. Definiramo 2 rukovatelja dogaฤ‘ajima za naลก dogaฤ‘aj 'data_received'.

Ako se gornji kod ispravno izvede, tekst u nastavku bit ฤ‡e prikazan na konzoli. To samo pokazuje da je rukovatelj dogaฤ‘ajem 'newListener' dvaput pokrenut.

Dodan sluลกatelj za data_received dogaฤ‘aje

Dodan sluลกatelj za data_received dogaฤ‘aje

Rezime

  • Streamovi se koriste u Node.js za ฤitanje i pisanje podataka s ulazno-izlaznih ureฤ‘aja. Node.js koristi biblioteku 'fs' za stvaranje tokova datoteka koji se mogu ฤitati i pisati. Ti se tokovi mogu koristiti za ฤitanje i pisanje podataka iz datoteka.
  • Cijevi se mogu koristiti za povezivanje viลกe tokova. Jedan od najฤeลกฤ‡ih primjera je povezivanje toka ฤitanja i pisanja zajedno za prijenos podataka iz jedne datoteke u drugu.
  • Node.js je takoฤ‘er ฤesto oznaฤen kao okvir voฤ‘en dogaฤ‘ajima, a vrlo je lako definirati dogaฤ‘aje u Node.js. Mogu se definirati funkcije koje odgovaraju na te dogaฤ‘aje.
  • Dogaฤ‘aji takoฤ‘er otkrivaju metode za reagiranje na kljuฤne dogaฤ‘aje. Na primjer, vidjeli smo rukovatelj dogaฤ‘ajem once() koji se moลพe koristiti kako bi se osiguralo da se funkcija povratnog poziva izvrลกava samo jednom kada se dogaฤ‘aj pokrene.

Saลพmite ovu objavu uz: