Velkommen til den andre delen av serien vår på generatorer og Koa. Hvis du savnet det, kan du lese lese del 1 her. Før du begynner med utviklingsprosessen, må du kontrollere at du har installert Node.js 0.11.9 eller høyere.
I denne delen skal vi lage en ordliste API ved hjelp av Koa.js, og du vil lære om ruting, komprimering, logging, takstbegrensning og feilhåndtering i Koa.js. Vi vil også bruke Mongo som vår datastore og lære kort om å importere data til Mongo og det enkle som kommer med spørring i Koa. Til slutt ser vi på feilsøking av Koa-apper.
Koa har radikale endringer bygget under sin hette som utnytter generatoren godhet av ES6. Bortsett fra endringen i kontrollflyten, introduserer Koa sine egne tilpassede objekter, for eksempel dette
, this.request
, og this.response
, som praktisk fungere som et syntaktisk-sukker laget bygget på toppen av Node's req og res gjenstander, gir deg tilgang til ulike bekvemmelighetsmetoder og getters / setters.
Bortsett fra bekvemmelighet renser Koa også middleware, som i Express stod på stygge hack som ofte endret kjerneobjekter. Det gir også bedre strømhåndtering.
En mellomvare er en pluggbar funksjon som legger til eller fjerner en bestemt funksjonalitet ved å gjøre noe arbeid i forespørsels- / responsobjektene i Node.js.
En Koa middleware er i hovedsak en generatorfunksjon som returnerer en generatorfunksjon og aksepterer en annen. Vanligvis har et program en serie mellomvare som kjøres for hver forespørsel.
En mellomvare må også gi til neste "nedstrøms" mellomvare hvis den drives av en "oppstrøms mellomvare". Vi vil diskutere mer om dette i feilhåndteringsseksjonen.
Bare en siste ting: For å legge til en mellomvare til Koa-applikasjonen bruker vi koa.use ()
metode og leverer mellomvarefunksjonen som argumentet. Eksempel: app.use (koa-logger)
legger koa-logger
til listen over mellomvare som programmet bruker.
For å starte med ordboken API trenger vi et fungerende sett med definisjoner. For å gjenopprette dette virkelige scenariet, bestemte vi oss for å gå med et ekte datasett. Vi tok definisjonen dump fra Wikipedia og lastet den inn i Mongo. Settet besto av ca 700 000 ord da vi bare importerte den engelske dumpen. Hver plate (eller dokument) består av et ord, dets type og dets betydning. Du kan lese mer om importprosessen i import.txt
fil i depotet.
For å bevege seg langs utviklingsprosessen, klon opp depotet og kontroller fremdriften ved å bytte til forskjellige forpliktelser. For å klone repoen, bruk følgende kommando:
$ git klon https://github.com/bhanuc/dictapi.git
Vi kan starte med å opprette en baseserver Koa:
var koa = krever ('koa'); var app = koa (); app.use (funksjon * (neste) this.type = 'json'; this.status = 200; this.body = 'Velkommen': 'Dette er et nivå 2 Hello World Application !!';); hvis (! module.parent) app.listen (3000); console.log ('Hello World kjører på http: // localhost: 3000 /');
I første linje importerer vi Koa og lagrer en forekomst i appvariabelen. Deretter legger vi til en enkelt mellomvare i linje 5, som er en anonym generatorfunksjon som tar den neste variabelen som en parameter. Her setter vi typen og statuskoden til svaret, som også bestemmes automatisk, men vi kan også sette dem manuelt. Så endelig satte vi opp svaret.
Siden vi har satt kroppen i vår første mellomvare, vil dette markere slutten av hver forespørselssyklus, og ingen annen mellomvare vil være involvert. Til slutt starter vi serveren ved å ringe den lytte
metode og send portnummeret som en parameter.
Vi kan starte serveren ved å kjøre skriptet via:
$ npm installere koa $ node --harmony index.js
Du kan nå direkte dette stadiet ved å flytte for å begå 6858ae0
:
$ git kassa 6858ae0
Ruting tillater oss å omdirigere forskjellige forespørsler til forskjellige funksjoner på grunnlag av forespørselstype og URL. For eksempel vil vi kanskje svare på /Logg Inn
annerledes enn melde deg på
. Dette kan gjøres ved å legge til en mellomvare, som manuelt sjekker nettadressen til mottatt forespørsel og kjører tilsvarende funksjoner. Eller, i stedet for å skrive den mellomvare manuelt, kan vi bruke en fellesskapsmessig mellomvare, også kjent som en mellomvaremodul.
For å legge til rutefunksjon i vårt program, bruker vi en fellesskapsmodul som heter koa-ruter
.
Å bruke koa-ruter
, Vi vil endre den eksisterende koden til koden som er vist nedenfor:
var koa = krever ('koa'); var app = koa (); var router = krever ('koa-router'); var mount = krever ('koa-mount'); var handler = funksjon * (neste) this.type = 'json'; this.status = 200; this.body = 'Welcome': 'Dette er et nivå 2 Hello World Application !!'; ; var APIv1 = ny router (); APIv1.get ('/ all', handler); app.use (mount ('/ v1', APIv1.middleware ())); hvis (! module.parent) app.listen (3000); console.log ('Hello World kjører på http: // localhost: 3000 /');
Her har vi importert to moduler, hvor router
butikker koa-ruter
og mount
lagrer koa-mount
modul, slik at vi kan bruke ruteren i vår Koa-applikasjon.
På linje 6 har vi definert vår behandleren
funksjon, som er den samme funksjonen som før, men her har vi gitt det et navn. På linje 12 lagrer vi en forekomst av ruteren i APIv1
, og på linje 13 registrerer vi vår handler for alle FÅ
forespørsler på ruten /alle
.
Så alle forespørsler unntatt når en få forespørsel sendes til localhost: 3000 / all
vil returnere "ikke funnet". Endelig på linje 15, bruker vi mount
middleware, som gir en brukbar generatorfunksjon som kan mates til app.use ()
.
For å nå dette trinnet direkte eller sammenligne programmet, utfør følgende kommando i klonet repo:
$ git kassa 8f0d4e8
Før vi kjører programmet, må vi nå installere koa-ruter
og koa-mount
ved hjelp av NPM
. Vi observerer at etter hvert som kompleksiteten i søknaden øker, øker antall moduler / avhengigheter også.
Å holde oversikt over all informasjon om prosjektet og gjøre data tilgjengelig for NPM
, Vi lagrer all informasjonen i package.json
inkludert alle avhengighetene. Du kan opprette package.json manuelt eller ved hjelp av et interaktivt kommandolinjegrensesnitt som åpnes ved hjelp av $ npm init
kommando.
"navn": "koa-api-ordbok", "versjon": "0.0.1", "beskrivelse": "koa-api-ordbok søknad" navn ":" Bhanu Pratap Chaudhary "," email ":" [email protected] "," depot ": " type ":" git "," url ":" https://github.com/bhanuc/ dictapi.git "," lisens ":" MIT "," motorer ": " node ":"> = 0.11.13 "
En veldig minimal package.json
filen ser ut som den ovenfor.
En gang package.json
er tilstede, kan du lagre avhengigheten ved å bruke følgende kommando:
$ npm installasjon--lagre
For eksempel: I dette tilfellet installerer vi modulene ved å bruke følgende kommando for å lagre avhengighetene i package.json
.
$ npm installere koa-router koa-mount --save
Nå kan du kjøre programmet ved hjelp av $ node --harmony index.js
.
Du kan lese mer om package.json
her.
Vi starter med å lage to ruter for API, en for å få et enkelt resultat i en raskere spørring, og et sekund for å få alle de matchende ordene (som er langsommere for første gang).
For å holde ting håndterbare, vil vi beholde alle API-funksjonene i en egen mappe som heter api
og en fil som heter api.js
, og importer den senere i vår hoved index.js
fil.
var munk = krever ('munk'); var wrap = krever ('co-monk'); var db = munk ('localhost / mydb'); var ord = wrap (db.get ('ord')); / ** * FÅ alle resultatene. * / exports.all = funksjon * () if (this.request.query.word) var res = yield words.find (word: this.request.query.word); this.body = res; ellers this.response.status = 404; ; / ** * FÅ et enkelt resultat. * / exports.single = function * () if (this.request.query.word) var res = yield words.findOne (word: this.request.query.word); this.body = res; ellers this.response.status = 404; ;
Her bruker vi co-munk
, som fungerer en wrapper rundt munk
, gjør det veldig enkelt for oss å spørre MongoDB ved hjelp av generatorer i Koa. Her importerer vi munk
og co-munk
, og koble til MongoDB-forekomsten på linje 3. Vi ringer pakke inn()
på samlinger, for å gjøre dem generasjonsvennlige.
Da legger vi til to generasjonsmetoder som heter alle
og enkelt
som en eiendom av eksport
variabel slik at de kan importeres i andre filer. I hver av funksjonene kontrollerer vi først for søkeparameteren "ord". Hvis det foreligger, spør vi om resultatet, ellers svarer vi med en 404-feil.
Vi bruker utbytte
søkeord for å vente på resultatene som diskutert i den første artikkelen, som pauser utførelsen til resultatet er mottatt. På linje 12 bruker vi finne
metode, som returnerer alle matchende ord, som er lagret i res og deretter sendt tilbake. På linje 23 bruker vi Finn én
metode tilgjengelig på samlingen, som returnerer det første matchende resultatet.
var koa = krever ('koa'); var app = koa (); var router = krever ('koa-router'); var mount = krever ('koa-mount'); var api = krever ('. / api / api.js'); var APIv1 = ny router (); APIv1.get ('/ all', api.all); APIv1.get ('/ single', api.single); app.use (mount ('/ v1', APIv1.middleware ())); hvis (! module.parent) app.listen (3000); console.log ('Dictapi kjører på http: // localhost: 3000 /');
Her importerer vi eksporterte metoder fra api.js
og vi tildeler handlere til FÅ
ruter /alle
/enkelt
og vi har en fullt funksjonell API og applikasjon klar.
For å kjøre programmet, trenger du bare å installere munk
og co-munk
moduler ved hjelp av kommandoen nedenfor. Sørg også for at du har en løpende forekomst av MongoDB der du har importert samlingen som er tilstede i git-repository ved hjelp av instruksjonene nevnt i import.txtweird
.
$ npm installer munk comonk - lagre
Nå kan du kjøre programmet ved å bruke følgende kommando:
$ node --harmony index.js
Du kan åpne nettleseren og åpne følgende nettadresser for å sjekke hvordan programmet fungerer. Bare erstatt "nytt" med ordet du vil spørre.
http: // localhost: 3000 / v1 / alle ord = new
http: // localhost: 3000 / v1 / enkelt ord = new
For å nå dette trinnet direkte eller sammenligne programmet, utfør følgende kommando i klonet repo:
$ git kassa f1076eb
Ved å bruke cascading middlewares kan vi fange feil ved hjelp av prøve / fangst
mekanisme, som hver mellomvare kan svare samtidig som den gir både nedstrøms og oppstrøms. Så, hvis vi legger til en Prøv og fangst middleware i begynnelsen av programmet, vil det fange alle feilene som oppstår i forespørselen i resten av middleware, da det vil være det siste mellomprogramvaren under oppstrømning. Legger til følgende kode på linje 10 eller tidligere inn index.js
burde virke.
app.use (funksjon * (neste) prøv yield next; // pass på kjøringen til nedstrøms middlewares catch (err) // kjøres bare når det oppstår en feil og ingen annen middleware reagerer på forespørselen this.type = 'json'; // valgfritt her this.status = err.status || 500; this.body = 'error': 'Søknaden gikk bare bonkers, forhåpentligvis har NSA alle loggene;)'; // delegere feilen tilbake til søknaden this.app.emit ('error', feil, dette); );
Lagring av logger er en viktig del av en moderne applikasjon, da logger er svært nyttige i feilsøking og å finne ut problemer i et program. De lagrer også alle aktivitetene og kan dermed brukes til å finne ut brukeraktivitetsmønstre og interessante andre mønstre.
Prisbegrensning har også blitt en viktig del av moderne applikasjoner, der det er viktig å stoppe spammere og roboter fra å kaste bort dyrebare serverressurser og å stoppe dem fra å skrape API.
Det er ganske enkelt å legge til logging og prisbegrensning til vår Koa-søknad. Vi vil bruke to fellesskapsmoduler: koa-logger
og koa-bedre-hastighetsbegrensende
. Vi må legge til følgende kode i vår søknad:
var logger = krever ('koa-logger'); vargrense = krever ('koa-better-ratelimit'); // Legg til linjene under like under feil middleware. ca. app.use (logger ());
Her har vi importert to moduler og lagt dem til som mellomvare. Loggeren logger hver forespørsel og skriver ut i stdout
av prosessen som lett kan lagres i en fil. Og begrense mellomvare begrenser antall forespørsler en gitt bruker kan be om i en gitt tidsramme (her er det maksimalt ti forespørsler om tre minutter). Du kan også legge til en rekke IP-adresser som vil bli svartelistet, og deres forespørsel blir ikke behandlet.
Husk å installere modulene før du bruker koden ved å bruke:
$ npm installere koa-logger koa-better-ratelimit --save
En av måtene å sikre raskere levering er å gzip ditt svar, noe som er ganske enkelt i Koa. For å komprimere trafikken i Koa, kan du bruke koa-komprimere
modul.
Her kan alternativene være en tom gjenstand eller kan konfigureres i henhold til kravet.
var compress = krever ('koa-compress'); var opts = filter: funksjon (content_type) return /text/i.test(content_type), // filterforespørsler som skal komprimeres ved hjelp av regex terskel: 2048, // minimumstørrelse for å komprimere flush: krever ('zlib') .Z_SYNC_FLUSH; // bruk koden under for å legge mellomprogramvaren til applikasjonen app.use (komprimere (opts));
Du kan til og med slå av komprimering i en forespørsel ved å legge til følgende kode i en mellomvare:
this.compress = true;
Ikke glem å installere komprimering med NPM
.
$ npm installere komprimere - lagre
For å nå dette trinnet direkte eller sammenligne programmet, utfør følgende kommando i klonet repo:
git kassa 8f5b5a6
Test bør være en viktig del av all kode, og man bør målrette mot maksimal testdekning. I denne artikkelen skal vi skrive tester for rutene som er tilgjengelige fra vår søknad. Vi vil bruke superteste og mokka til å lage våre tester.
Vi lagrer testen vår i test.js
i api
mappe. I begge testene beskriver vi først vår test, og gir den et mer menneskelig lesbart navn. Etter det vil vi passere en anonym funksjon som beskriver korrekt oppførsel av testen, og tar en tilbakering som inneholder den faktiske testen. I hver test importerer vi programmet, starter serveren, beskriver forespørselstypen, nettadressen og spørringen, og sett deretter inn kodingen til gzip. Til slutt ser vi etter svaret hvis det er riktig.
var request = krever ('supertest'); var api = krever ('... / index.js'); Beskriv ('GET ALL', funksjon () det ('skal svare med alle ordene', funksjon (ferdig) var app = api; request (app.listen ()) .get ('/ v1 / all') .query (word: 'new') .set. ('Godta-Koding', 'gzip') .expect ('Content-Type', / json /) .expect (200) .end (ferdig);) app api; request app.listen .get '/ v1 / single ') .query (word:' new ') .set. (' Godta-Koding ',' gzip ') .expect (200) .expect (' Content-Type ', / json /) .end funksjon (feil, res) hvis (feil) kaste feil, ellers hvis (! ('_ id' i res.body)) returnere "missing id" Feil ("manglende ord"); ferdig (););))
For å kjøre testen, vil vi lage en Makefile
:
test: @ NODE_ENV = test ./node_modules/.bin/mocha \ --require should \ --reporter nyan \ --harmony \ --bail \ api / test.js .PHONY: test
Her har vi konfigurert reporteren (nyan cat) og testrammen (mocha). Legg merke til at importen skal legge til --harmoni
for å aktivere ES6 modus. Til slutt spesifiserer vi også plasseringen av alle testene. EN Makefile
kan konfigureres for endeløs testing av søknaden din.
For å teste appen din, bruk bare kommandoen i hovedmappen til programmet.
$ gjør testen
Bare husk å installere testmoduler (mocha, should, supertest) før testing, ved hjelp av kommandoen nedenfor:
$ npm installere mocha bør mocha - save-dev
For å kjøre våre applikasjoner i produksjon, vil vi bruke PM2, som er en nyttig Node-prosessmonitor. Vi bør deaktivere loggerenheten mens den er i produksjon. Det kan automatiseres ved hjelp av miljøvariabler.
For å installere PM2, skriv inn følgende kommando i terminal
$ npm installere pm2 -g
Og vår app kan bli lansert ved hjelp av følgende kommando:
$ pm2 start index.js --node-args = "- harmoni"
Nå, selv om applikasjonen vår krasjer, starter den automatisk igjen, og du kan sove godt.
Koa er en lys og uttrykksfulle mellomvare for Node.js som gjør prosessen med å skrive webapplikasjoner og APIer morsommere.
Det gir deg mulighet til å utnytte en rekke fellesskapsmoduler for å utvide funksjonaliteten til søknaden din og forenkle alle verdslige oppgaver, slik at webutvikling er en morsom aktivitet.
Ikke nøl med å legge igjen noen kommentarer, spørsmål eller annen informasjon i feltet under.