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
Datayhteys
Jasmiinin käyttö
Vaihe 2) Kirjoita asiaankuuluva koodi, joka käyttää tietovirtoja datan lukemiseen tiedostosta.
var fs = require("fs"); var stream; stream = fs.createReadStream("D://data.txt"); stream.on("data", function(data) { var chunk = data.toString(); console.log(chunk); });
Koodin selitys: -
- Ensin meidän on sisällytettävä "fs"-moduulit, jotka sisältävät kaikki toiminnot, joita tarvitaan streamien luomiseen.
- Seuraavaksi luomme luettavan virran menetelmällä createReadStream. Syötteenä annamme data.txt-tiedostomme sijainnin.
- 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.
- Otamme jokaisen tietovirrasta luetun datapalan ja muunnamme sen merkkijonoksi.
- Lopuksi lähetämme jokaisen muunnetun merkkijonon tulosteen konsoliin.
lähtö:
- 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.
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")
Koodin selitys: -
- Luomme kirjoitettavan streamin menetelmällä createWriteStream. Syötteenä annamme data.txt-tiedostomme sijainnin.
- 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.
var fs = require("fs"); var readStream = fs.createReadStream("D://datainput.txt"); var writeStream = fs.createWriteStream("D://dataOutput.txt"); readStream.pipe(writeStream);
Koodin selitys: -
- Luomme ensin "readstream" datainput.txt-tiedostoomme, joka sisältää kaikki tietomme, jotka on siirrettävä uuteen tiedostoon.
- Meidän on sitten luotava "kirjoitusvirta" dataOutput.txt-tiedostoomme, joka on tyhjä tiedostomme ja datainput.txt-tiedoston tietojen siirron kohde.
- 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.
var events = require('events'); var eventEmitter = new events.EventEmitter(); eventEmitter.on('data_received', function() { console.log('data received succesfully.'); }); eventEmitter.emit('data_received');
Koodin selitys: -
- Käytä vaadi-funktiota sisällyttääksesi "tapahtumat"-moduulin. Tämän moduulin avulla voit luoda tapahtumia Node.js:ssä.
- 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.
- Määrittelemme tapahtumapohjaisen funktion, joka sanoo, että jos "data_received" -tapahtuma laukeaa, meidän pitäisi tulostaa teksti "data_received" konsoliin.
- 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.
Tapahtumien lähettäminen
Tapahtumia määritettäessä on olemassa erilaisia menetelmiä tapahtumille, joita voidaan kutsua. Tämä aihe keskittyy tarkastelemaan jokaista niistä yksityiskohtaisesti.
- 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.
Koodin selitys: -
- Tässä käytämme "once"-menetelmää sanoaksemme, että tapahtuman "data_received" takaisinkutsutoiminto tulisi suorittaa vain kerran.
- Tässä käynnistämme manuaalisesti data_received -tapahtuman.
- 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.
- 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.)
Koodin selitys: -
- Määrittelemme eventEmitter-tyyppiä, jota tarvitaan tapahtumaan liittyvien menetelmien käyttöön.
- Sitten määrittelemme objektin nimeltä emitter, jota käytetään tapahtumakäsittelijöiden määrittelemiseen.
- 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.
- 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.
- 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.
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() {});
Koodin selitys: -
- Luomme uutta tapahtumakäsittelijää "newListener" -tapahtumalle. Joten aina kun uusi tapahtumakäsittelijä rekisteröidään, teksti "Lisätty kuuntelija" + tapahtuman nimi näkyy konsolissa.
- Täällä kirjoitamme konsoliin tekstiä "Lisätty kuuntelija" + tapahtuman nimi jokaiselle rekisteröidylle tapahtumalle.
- 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.