Node js Streams -opastus: Filestream, Pipes

Tiedostovirta Node.js:ssรค

Node kรคyttรครค laajasti tietovirtoja tiedonsiirtomekanismina.

Kun esimerkiksi tulostat konsoliin jotain kรคyttรคmรคllรค console.log-funktiota, kรคytรคt itse asiassa tietovirtaa tietojen lรคhettรคmiseen konsoliin.

Node.js pystyy myรถs suoratoistamaan tietoja tiedostoista, jotta niitรค voidaan lukea ja kirjoittaa oikein. Tarkastellaan nyt esimerkkiรค siitรค, kuinka voimme kรคyttรครค virtoja tiedostojen lukemiseen ja kirjoittamiseen. Meidรคn on noudatettava alla mainittuja vaiheita tรคssรค esimerkissรค

Vaihe 1) Luo tiedosto nimeltรค data.txt, joka sisรคltรครค alla olevat tiedot. Oletetaan, ettรค tรคmรค tiedosto on tallennettu paikallisen koneemme D-asemalle.

Node.js:n opetusohjelma

esittely

Tapahtumat

Generators

Datayhteys

Jasmiinin kรคyttรถ

Vaihe 2) Kirjoita asiaankuuluva koodi, joka kรคyttรครค tietovirtoja datan lukemiseen tiedostosta.

Tiedostovirta Node.js:ssรค

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 Selitys:-

  1. Ensin meidรคn on sisรคllytettรคvรค "fs"-moduulit, jotka sisรคltรคvรคt kaikki toiminnot, joita tarvitaan streamien luomiseen.
  2. Seuraavaksi luomme luettavan virran menetelmรคllรค createReadStream. Syรถtteenรค annamme data.txt-tiedostomme sijainnin.
  3. Steam.on-funktio on tapahtumakรคsittelijรค, ja siinรค mรครคritรคmme ensimmรคisen parametrin dataksi. Tรคmรค tarkoittaa, ettรค aina kun dataa tulee tiedostosta, suorita takaisinsoittotoiminto. Meidรคn tapauksessamme mรครคrittelemme takaisinsoittotoiminnon, joka suorittaa 2 perusvaihetta. Ensimmรคinen on muuntaa tiedostosta luetut tiedot merkkijonoksi. Toinen olisi lรคhettรครค muunnettu merkkijono tulosteena konsoliin.
  4. Otamme jokaisen tietovirrasta luetun datapalan ja muunnamme sen merkkijonoksi.
  5. Lopuksi lรคhetรคmme jokaisen muunnetun merkkijonon tulosteen konsoliin.

lรคhtรถ:

Tiedostovirta Node.js:ssรค

  • Jos koodi suoritetaan oikein, nรคet yllรค olevan tulosteen konsolissa. Tรคmรค tulos on sama kuin data.txt-tiedostossa.

Kirjoittaminen tiedostoon

Samalla tavalla kuin luomme lukuvirran, voimme myรถs luoda kirjoitusvirran tietojen kirjoittamiseksi tiedostoon. Luodaan ensin tyhjรค tiedosto nimeltรค data.txt ilman sisรคltรถรค. Oletetaan, ettรค tรคmรค tiedosto on sijoitettu tietokoneemme D-asemaan.

Alla oleva koodi nรคyttรครค, kuinka voimme kirjoittaa tietoja tiedostoon.

Tiedostovirta Node.js:ssรค

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 Selitys:-

  1. Luomme kirjoitettavan streamin menetelmรคllรค createWriteStream. Syรถtteenรค annamme data.txt-tiedostomme sijainnin.
  2. Seuraavaksi kรคytimme stream.write-menetelmรครค eri tekstirivien kirjoittamiseen tekstitiedostoomme. Stream huolehtii nรคiden tietojen kirjoittamisesta data.txt-tiedostoon.

Jos avaat data.txt-tiedoston, nรคet nyt tiedostossa seuraavat tiedot

Node.js:n opetusohjelma

esittely

Tapahtumat

Generators

Datayhteys

Kรคyttรคminen Jasmiini

Putket Node.js:ssรค

Solmusovellusten sisรคllรค virrat voidaan yhdistรครค pipe()-menetelmรคllรค, jossa on kaksi argumenttia:

  • Vaadittu kirjoitettava tietovirta, joka toimii tietojen mรครคrรคnpรครคnรค ja
  • Valinnainen objekti, jota kรคytetรครคn vaihtoehtojen vรคlittรคmiseen.

Tyypillinen esimerkki putkien kรคytรถstรค, jos haluat siirtรครค tietoja tiedostosta toiseen.

Katsotaanpa siis esimerkkiรค siitรค, kuinka voimme siirtรครค tietoja tiedostosta toiseen putkien avulla.

Vaihe 1) Luo tiedosto nimeltรค datainput.txt, joka sisรคltรครค alla olevat tiedot. Oletetaan, ettรค tรคmรค tiedosto on tallennettu paikallisen koneemme D-asemalle.

Node.js:n opetusohjelma

esittely

Tapahtumat

Generators

Datayhteys

Jasmiinin kรคyttรถ

Vaihe 2) Luo tyhjรค tyhjรค tiedosto nimeltรค dataOutput.txt ja sijoita se paikallisen koneen D-asemaan.

Vaihe 3) Kirjoita alla oleva koodi suorittaaksesi tiedonsiirron datainput.txt-tiedostosta dataOutput.txt-tiedostoon.

Putket Node.js:ssรค

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

Code Selitys:-

  1. Luomme ensin "readstream" datainput.txt-tiedostoomme, joka sisรคltรครค kaikki tietomme, jotka on siirrettรคvรค uuteen tiedostoon.
  2. Meidรคn on sitten luotava "kirjoitusvirta" dataOutput.txt-tiedostoomme, joka on tyhjรค tiedostomme ja datainput.txt-tiedoston tietojen siirron kohde.
  3. Kรคytรคmme sitten pipe-komentoa tietojen siirtรคmiseen lukuvirrasta kirjoitusvirtaan. Putkikomento ottaa kaikki lukuvirtaan tulevat tiedot ja tyรถntรครค sen kirjoitusvirtaan.

Jos nyt avaat dataOutput.txt-tiedoston, nรคet kaikki datainput.txt-tiedostossa olleet tiedot.

Tapahtumat Node.js:ssรค

Tapahtumat ovat yksi Node.js:n avainkรคsitteistรค, ja joskus Node.js:รครค kutsutaan tapahtumalรคhtรถiseksi viitekehykseksi.

Periaatteessa tapahtuma on jotain, joka tapahtuu. Jos esimerkiksi muodostetaan yhteys tietokantaan, tietokantayhteystapahtuma laukeaa. Tapahtumapohjaisen ohjelmoinnin tarkoituksena on luoda toimintoja, jotka kรคynnistyvรคt, kun tietyt tapahtumat laukaistaan.

Katsotaanpa perusesimerkkiรค tapahtuman mรครคrittรคmisestรค Node.js:ssรค.

Aiomme luoda tapahtuman nimeltรค 'data_received'. Kun tรคmรค tapahtuma laukeaa, teksti "data vastaanotettu" lรคhetetรครคn konsoliin.

Tapahtumat Node.js:ssรค

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

eventEmitter.emit('data_received'); 

Code Selitys:-

  1. Kรคytรค vaadi-funktiota sisรคllyttรครคksesi "tapahtumat"-moduulin. Tรคmรคn moduulin avulla voit luoda tapahtumia Node.js:ssรค.
  2. Luo uusi tapahtumien lรคhettรคjรค. Tรคtรค kรคytetรครคn tapahtuman sitomiseen, joka meidรคn tapauksessamme on "data_received" takaisinsoittotoimintoon, joka mรครคritellรครคn vaiheessa3.
  3. Mรครคrittelemme tapahtumapohjaisen funktion, joka sanoo, ettรค jos "data_received" -tapahtuma laukeaa, meidรคn pitรคisi tulostaa teksti "data_received" konsoliin.
  4. Lopuksi meillรค on tapahtumamme manuaalinen laukaisu kรคyttรคmรคllรค eventEmiter.emit-toimintoa. Tรคmรค kรคynnistรครค data_received -tapahtuman.

Kun ohjelma ajetaan, teksti "data vastaanotettu" lรคhetetรครคn konsoliin alla olevan kuvan mukaisesti.

Tapahtumat Node.js:ssรค

Tapahtumien lรคhettรคminen

Tapahtumia mรครคritettรคessรค on olemassa erilaisia โ€‹โ€‹menetelmiรค tapahtumille, joita voidaan kutsua. Tรคmรค aihe keskittyy tarkastelemaan jokaista niistรค yksityiskohtaisesti.

  1. Kertaluonteiset tapahtumakรคsittelijรคt

Joskus saatat olla kiinnostunut reagoimaan tapahtumaan vasta ensimmรคisen kerran. Nรคissรค tilanteissa voit kรคyttรครค Once()-menetelmรครค.

Katsotaanpa, kuinka voimme hyรถdyntรครค kerta-menetelmรครค tapahtumakรคsittelijรถille.

Tapahtumien lรคhettรคminen

Code Selitys:-

  1. Tรคssรค kรคytรคmme "once"-menetelmรครค sanoaksemme, ettรค tapahtuman "data_received" takaisinkutsutoiminto tulisi suorittaa vain kerran.
  2. Tรคssรค kรคynnistรคmme manuaalisesti data_received -tapahtuman.
  3. Kun 'data_received' -tapahtuma kรคynnistyy uudelleen, tรคllรค kertaa mitรครคn ei tapahdu. Tรคmรค johtuu ensimmรคisestรค vaiheesta, jossa sanoimme, ettรค tapahtuma voidaan kรคynnistรครค vain kerran.

Jos koodi suoritetaan oikein, lokin tulos on 'data_received onnistui'. Tรคmรค viesti nรคkyy vain kerran konsolissa.

  1. Tapahtumien kuuntelijoiden tarkastus

Milloin tahansa sen elinkaaren aikana tapahtumalรคhettimellรค voi olla nolla tai useampi kuuntelija. Kunkin tapahtumatyypin kuuntelijat voidaan tarkastaa monella tavalla.

Jos olet kiinnostunut vain mรครคrittรคmรครคn liitteenรค olevien kuuntelijoiden lukumรครคrรคn, etsi vain EventEmitter.listenerCount()-metodia.

(Huomautus: Kuuntelijat ovat tรคrkeitรค, koska pรครคohjelman pitรคisi tietรครค, jos kuuntelijoita lisรคtรครคn tapahtumaan lennossa, muuten ohjelma ei toimi, koska lisรครค kuuntelijoita kutsutaan.)

Tapahtumien lรคhettรคminen

Code Selitys:-

  1. Mรครคrittelemme eventEmitter-tyyppiรค, jota tarvitaan tapahtumaan liittyvien menetelmien kรคyttรถรถn.
  2. Sitten mรครคrittelemme objektin nimeltรค emitter, jota kรคytetรครคn tapahtumakรคsittelijรถiden mรครคrittelemiseen.
  3. Luomme 2 tapahtumakรคsittelijรครค, jotka periaatteessa eivรคt tee mitรครคn. Tรคmรค on pidetty esimerkissรคmme yksinkertaisena vain sen osoittamiseksi, kuinka listenerCount-menetelmรค toimii.
  4. Nyt kun kutsut listenerCount-menetelmรคn data_received-tapahtumassamme, se lรคhettรครค konsolin lokiin tรคhรคn tapahtumaan liitettyjen tapahtumaseurainten mรครคrรคn.

Jos koodi suoritetaan oikein, arvo 2 nรคkyy konsolin lokissa.

  1. UusiListener-tapahtuma

Joka kerta kun uusi tapahtumakรคsittelijรค rekisterรถidรครคn, tapahtumalรคhettรคjรค lรคhettรครค newListener-tapahtuman. Tรคtรค tapahtumaa kรคytetรครคn uusien tapahtumakรคsittelijรถiden havaitsemiseen. Kรคytรคt yleensรค newListener-tapahtumaa, kun joudut allokoimaan resursseja tai suorittamaan toimenpiteitรค jokaiselle uudelle tapahtumakรคsittelijรคlle.

Tapahtumien lรคhettรคminen

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 Selitys:-

  1. Luomme uutta tapahtumakรคsittelijรครค "newListener" -tapahtumalle. Joten aina kun uusi tapahtumakรคsittelijรค rekisterรถidรครคn, teksti "Lisรคtty kuuntelija" + tapahtuman nimi nรคkyy konsolissa.
  2. Tรครคllรค kirjoitamme konsoliin tekstiรค "Lisรคtty kuuntelija" + tapahtuman nimi jokaiselle rekisterรถidylle tapahtumalle.
  3. Mรครคrittelemme 2 tapahtumakรคsittelijรครค tapahtumallemme 'data_received'.

Jos yllรค oleva koodi suoritetaan oikein, alla oleva teksti nรคytetรครคn konsolissa. Se vain osoittaa, ettรค "newListener" -tapahtumakรคsittelijรค laukaistiin kahdesti.

Lisรคtty kuuntelija data_received -tapahtumille

Lisรคtty kuuntelija data_received -tapahtumille

Yhteenveto

  • Virtoja kรคytetรครคn Node.js:ssรค tietojen lukemiseen ja kirjoittamiseen syรถttรถ-lรคhtรถlaitteista. Node.js kรคyttรครค "fs"-kirjastoa luodakseen luettavia ja kirjoitettavia tiedostoja tiedostoihin. Nรคitรค virtoja voidaan kรคyttรครค tiedostojen tietojen lukemiseen ja kirjoittamiseen.
  • Putkella voidaan yhdistรครค useita virtoja yhteen. Yksi yleisimmistรค esimerkeistรค on yhdistรครค luku- ja kirjoitusvirta datan siirtรคmiseksi tiedostosta toiseen.
  • Node.js on usein myรถs merkitty tapahtumapohjaiseksi kehykseksi, ja tapahtumien mรครคrittรคminen Node.js:ssรค on erittรคin helppoa. Voidaan mรครคritellรค toimintoja, jotka reagoivat nรคihin tapahtumiin.
  • Tapahtumat paljastavat myรถs tapoja reagoida avaintapahtumiin. Olemme esimerkiksi nรคhneet one()-tapahtumakรคsittelijรคn, jonka avulla voidaan varmistaa, ettรค takaisinsoittotoiminto suoritetaan vain kerran, kun tapahtuma laukaistaan.

Tiivistรค tรคmรค viesti seuraavasti: