Koa.js is een expressief web-framework van de volgende generatie geschreven voor Node.js door de mensen achter de Express en Connect-frameworks. Koa.js maakt gebruik van generatoren, een logische functie van JavaScript, en is nog niet omgezet in stabiele versies van Node.js. Koa wil generatoren gebruiken om ontwikkelaars te redden van de spaghetti van callbacks, waardoor het minder foutgevoelig en dus hanteerbaarder wordt.
Met slechts 550 regels code is Koa een extreem licht raamwerk. Zelfs daarna zorgt Koa voor een elegante reeks methoden, zoals inhoud-onderhandeling, omleidingen, proxy-ondersteuning, enz., Waardoor je gemak en snelheid van ontwikkeling krijgt, samen met de granulaire controle over je node-applicatie.
Nu voordat we beginnen, moet je op zijn minst een Node-versie hebben 0.11.x
of groter.
U kunt de nieuwste versie van Node installeren met behulp van de N-module:
sudo npm install -g n sudo n stable
U kunt ook andere community-modules zoals nvm gebruiken of deze van de bron opbouwen. Houd er rekening mee dat N ook een communitymodule is.
Als u een JS-bestand wilt uitvoeren dat gebruikmaakt van generatoren, moet u het --harmonie
vlag wanneer u het uitvoert.
Bijvoorbeeld om uit te voeren app.js
, voer de volgende opdracht in:
knooppunt - harmony app.js
Of om elke keer weer te voorkomen dat u deze vlag invoert, kunt u een alias maken met behulp van de volgende opdracht:
alias node = "node --harmony"
Om nu uw applicatie met generators te gebruiken, voert u gewoon in:
knooppunt app.js
Heel goed! Houd er ook rekening mee dat alle code in dit artikel beschikbaar is op GitHub. Voel en speel ermee.
Om Koa nu te begrijpen, moet je eerst generatoren begrijpen die de ruggengraat vormen van het raamwerk.
Met ES-6 zijn generatoren eindelijk geland in het magische land van JavaScript. Als u ervaring hebt met generatoren in Lua, Python, Scheme, Smalltalk, enz., Zou u blij zijn te weten dat een soortgelijk iets is geïmplementeerd in JavaScript.
Generators zijn eersteklas co-routines in JavaScript die, eenvoudig gezegd, een pauze- en afspeelinterface introduceren in de taal. Voor generatoren, het hele script was dat doorgaans uitvoeren in een volgorde van boven naar beneden, zonder een eenvoudige manier om de uitvoering van de code te stoppen en later met dezelfde stapel te hervatten. Laten we nu onze handen vies maken met enkele voorbeelden.
Volgens de huidige ontwerpspecificatie ES-6 moeten we een andere versie van de functiedefinitie gebruiken om een generatorfunctie te maken. Het ziet er zo uit:
var generator_func = function * () ;
Hier generator_func
is gewoon een lege generatorfunctie.
Dus wat we kunnen doen is gebruik maken van de opbrengst
sleutelwoord in de functie om de uitvoering te stoppen en de huidige stapel op te slaan.
Hier is een eenvoudig voorbeeld van de som van een oneindig AP:
var r = 3; function * oneindig_ap (a) voor (;;) a = a + r; opbrengst a; var sum = infinite_ap (5); console.log (sum.next ()); // geeft value: 8, done: false console.log (sum.next ()); // retourneert value: 11, done: false
In de bovenstaande code maken we in eerste instantie een naam voor een iterator infinite_ap
die een oneindige lus bevat en indien uitgevoerd onder normale omstandigheden, de uitvoering kan bevriezen.
Vervolgens slaan we een iteratorinstantie op in de som
veranderlijk.
Nu, wanneer we bellen sum.next ()
, het komt terug value: 8, done: false
wat betekent dat het de uitvoering ervan op de opbrengst
verklaring die het waarde
als 'een' en gedaan
als 'vals' .
Hier gedaan
geeft false terug totdat de uitvoering niet voltooid is. Nadat de uitvoering is voltooid (in het bovengenoemde geval gebeurt dit nooit), keert de functie terug value: undefined, done: true
.
Hier is een kleine wijziging van de vorige code om het einde van de uitvoering aan te tonen:
var r = 3; function * oneindig_ap (a) voor (var i = 0; i < 3 ; i++) a = a + r ; yield a; var sum = infinite_ap(5); console.log(sum.next()); // returns value : 8, done : false console.log(sum.next()); // returns value : 11, done: false console.log(sum.next()); // returns value : 14, done: false console.log(sum.next()); //return value: undefined, done: true
In meer complexe programma's zou u de geretourneerde waarden en de gedaan
staat.
Notitie: Gebruik makend van opbrengst
zonder functie*
zou tot een vroege fout leiden.
Hier zijn enkele veelgebruikte methoden die van pas zullen komen als je te maken hebt met vanille-generatoren.
Elk van de onderstaande methoden is alleen beschikbaar in een generatorfunctie en zou anders een fout veroorzaken.
next ()
Dit wordt gebruikt om de uitvoering te hervatten samen met het doorgeven van een argument. Als er niets wordt doorgegeven, wordt ongedefinieerd als eerste argument aangenomen.
Voorbeeld: sum.next (5);
gooien()
Dit wordt gebruikt om bij elke stap een fout of uitzondering te genereren. Het maakt het afhandelen van fouten veel gemakkelijker. Het weggooien van een fout kan leiden tot het stoppen van de uitvoering van het bestand, als het niet ergens wordt afgehandeld. De eenvoudigste manier om een fout af te handelen is door een try- en catch-verklaring te gebruiken. Deze methode neemt een enkel argument dat van alles kan zijn.
Voorbeeld: sum.throw (nieuwe Fout ("dit is een fout"));
opbrengst
Generatorafvaardiging wordt gebruikt om een generator binnen een bestaande generator op te leveren en kan worden gebruikt om generatoren samen te stellen of zelfs over een generator te itereren.
Bij het delegeren naar een andere generator stopt de stroomgenerator zelf met het produceren van een waarde en begint de waarden van de gedelegeerde generator op te leveren totdat deze uitgeput is. Na uitputting van de gedelegeerde generator, gaat de generator verder met het retourneren van zijn eigen waarde.
Het lijkt veel op het gebruik van een voor in
loop over een generator, maar de uitzonderingen van de gedelegeerde generator worden gepropageerd en gegooid via de buitenste generator gooien
methode en moet op dezelfde manier worden behandeld. Hier is een voorbeeld:
var consoleLogThunk = function (msg) return function () console.log (msg); var generator = function * () render consoleLogThunk ("Yo"); opbrengst consoleLogThunk ("Dawg"); opbrengst consoleLogThunk ("!!!"); var delegator_function = function * () yield consoleLogThunk ("Ik heb meegegeven voor gedelegeerde opbrengst"); opbrengst * generator (); opbrengst consoleLogThunk ("Ik gaf na gedelegeerde opbrengst"); var k = delegator_function (); k.next () waarde ().; k.next () waarde ().; k.next () waarde ().; console.log (k.next ()); // Als u k.next () aanroept, wordt er een typefout gegenereerd, omdat de waarde ongedefinieerd is, wat geen functie is
Nu u een korte kennis hebt van generators in Javascript, kunt u ze gebruiken voor het schrijven van veel duidelijker en minder foutgevoelige applicaties waar u kunt blokkeren op I / O, zonder het proces te blokkeren.
Laten we nu verder gaan met de installatie van Koa en een zeer eenvoudige applicatie op basis van Koa.js.
Koa is een object dat een array van middleware-generatorfuncties bevat, die allemaal op een stapelachtige manier worden samengesteld en uitgevoerd op elk verzoek.
Voer in de projectdirectory de volgende opdracht uit.
npm install koa --save
Koa wordt automatisch gedownload en opgeslagen in een package.json
bestand, als het bestaat.
Ondanks Koa's zeer kleine footprint, omvat het methoden voor taken zoals cache-versheid, inhoud-onderhandeling, omleidingen, proxy-ondersteuning enz., Zonder middleware gebundeld in.
Hier is een voorbeeld van een hello-wereldapplicatie:
var koa = require ('koa'); var app = koa (); app.use (function * () this.body = "Hello World !!!";); app.listen (3000);
Nu, Koa implementeert ook downstreaming gevolgd door upstreaming van de controlestroom. In het begin kan het moeilijk zijn om naar adem te happen, maar als je eenmaal door het onderstaande voorbeeld bent gegaan, wordt alles duidelijker.
Hier is een voorbeeld van de controlestroom in Koa:
var koa = require ('koa') (); koa.use (functie * (volgende) // doe iets alvorens op te geven / door te geven aan de volgende generatorfunctie in regel die de eerste gebeurtenis in de console console.log ("A") zal zijn; opbrengst volgende; // doe iets wanneer de uitvoering retourneert stroomopwaarts, dit is de laatste gebeurtenis in de upstream console.log ("B");); koa.use (functie * (volgende) // doe iets voordat u in de rij toekomt / doorgeeft aan de volgende generatorfunctie, dit zal 2e gebeurtenis zijn downstream console.log ("C"); opbrengst volgende; // doe iets wanneer de execution retourneert upstream en dit zou 2nd event upstream console.log ("D");) zijn; koa.use (function * () // doe iets voordat je de volgende generatorfunctie in de rij krijgt / doorgeeft. Hier zou het de laatste functie zijn downstream console.log ("E"); this.body = "hey guys"; console .log ("F"); // Eerste evenement van stroomopwaarts (van de laatste naar de eerste)); koa.listen (3000);
De bovenstaande code is vrij eenvoudig. Merk op dat niet alles console.log
Verklaringen zijn vereist, maar deze zullen u helpen om de stroomafwaartse en stroomafwaartse uitvoeringsstroom van Koa.js duidelijk te begrijpen .
Wanneer we deze applicatie uitvoeren en openen localhost: 3000
in de browser kunnen we waarnemen dat de console.logs
in de terminal zijn niet in de volgorde van A-B-C-D-E-F. Evenmin zijn ze in de volgorde van A-C-E-B-D-F.
De volgorde is eigenlijk A-C-E-F-D-B die stroomafwaarts van de opbrengsten en het stroomopwaartse gedrag van de uitvoering in een Koa-app weergeeft.
U merkt misschien dat het twee keer wordt afgedrukt. Dit is het gevolg van een dubbel verzoek dat door de browser is verzonden om het favicon op te halen.
Tip: De koa.use (functie)
voegt de middleware-functie toe aan de applicatie.
Dus dat is het voor deel een van deze tutorial over JavaScript-generators en Koa.js. U hebt kennisgemaakt van de meeste vereisten, zoals generators, gebruikstoepassingen, overdracht van opbrengst en hoe regelstroom werkt in Koa.js.
In het volgende deel van deze tutorial duiken we dieper in Koa en leren we hoe we een CRUD-applicatie kunnen bouwen. Als je vragen of opmerkingen hebt, neem dan gerust contact met me op of stuur gewoon een reactie hieronder.