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
Podatkovna povezanost
Koriลกtenje Jasmina
Korak 2) Napiลกite odgovarajuฤi kod koji ฤe koristiti streamove za ฤitanje podataka iz datoteke.
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:-
- Najprije moramo ukljuฤiti 'fs' module koji sadrลพe sve funkcije potrebne za stvaranje tokova.
- Zatim stvaramo ฤitljiv stream pomoฤu metode โ createReadStream. Kao unos dajemo lokaciju naลกe datoteke data.txt.
- 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.
- Uzimamo svaki dio podataka koji se ฤita iz toka podataka i pretvaramo ga u niz.
- Konaฤno, ลกaljemo izlaz svakog niza pretvorenog dijela na konzolu.
Izlaz:
- 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.
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:-
- Kreiramo tok koji se moลพe pisati koriลกtenjem metode โ createWriteStream. Kao unos dajemo lokaciju naลกe datoteke data.txt.
- 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.
var fs = require("fs");
var readStream = fs.createReadStream("D://datainput.txt");
var writeStream = fs.createWriteStream("D://dataOutput.txt");
readStream.pipe(writeStream);
Code Obrazloลพenje:-
- Prvo stvaramo "readstream" za naลกu datainput.txt datoteku koja sadrลพi sve naลกe podatke koje je potrebno prenijeti u novu datoteku.
- 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.
- 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.
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:-
- Upotrijebite funkciju require za ukljuฤivanje modula 'dogaฤaji'. Pomoฤu ovog modula moฤi ฤete kreirati dogaฤaje u Node.js.
- 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.
- 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.
- 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.
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.
- 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.
Code Obrazloลพenje:-
- Ovdje koristimo metodu 'jednom' kako bismo rekli da se za dogaฤaj 'data_received' funkcija povratnog poziva treba izvrลกiti samo jednom.
- Ovdje ruฤno pokreฤemo dogaฤaj 'data_received'.
- 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.
- 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.)
Code Obrazloลพenje:-
- Definiramo tip eventEmitter koji je potreban za koriลกtenje metoda povezanih s dogaฤajima.
- Zatim definiramo objekt koji se zove emiter koji ฤe se koristiti za definiranje naลกih rukovatelja dogaฤajima.
- 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.
- 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.
- 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.
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:-
- 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.
- Ovdje upisujemo na konzolu tekst โDodan sluลกatelj zaโ + naziv dogaฤaja za svaki registrirani dogaฤaj.
- 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.









