Møt Connect Framework

Nykommere til NodeJS finner vanligvis sin API vanskelig å forstå. Heldigvis har mange utviklere laget rammer som gjør det enklere å jobbe med Node. Koble til er et slikt rammeverk. Den sitter på toppen av Node API og trekker linjen mellom komfort og kontroll.

Tenk på Koble til som en stabel med mellomvare. Ved hver forespørsel, Koble filtre gjennom lagene av mellomvare, som hver har mulighet til å behandle HTTP-forespørselen. Når T.J. Holowaychuk kunngjorde Connect, han sa at det var to typer mellomvare. Den første er a filter.

Filter behandler forespørselen, men de svarer ikke på det (tenk på serverlogging).

Den andre typen er a forsørger, som svarer på forespørselen. Du kan innlemme så mange lag med mellomvare som du vil ha; forespørselen går gjennom hvert lag til en av middleware reagerer på forespørselen.


Grunnleggende syntaks

Først må du installere Connect-pakken via npm:

npm installer koble til

Opprett nå en server.js fil, og legg til følgende kode:

var connect = krever ("connect");

De koble variabel er en funksjon som returnerer et nytt Connect-program. Så, vårt neste skritt er å lage den appen:

var app = connect ();

Du trenger ikke å opprette en app variabel for de fleste av programmene dine. Funksjonene som er involvert i å lage et program (koble() og bruk()) er kjedbare:

koble til () .use (/ * middleware * /) .use (/ * middleware * /) .listen (3000);

De bruk() funksjon legger til et lag med mellomvare til applikasjonen, og lytte() funksjonen forteller at søknaden vår begynner å akseptere tilkoblinger på den angitte porten (3000 i dette eksemplet).

La oss starte med noe enkelt: logging. Koden for et Koble-program som bare bruker loggingsprogramvare er ganske enkelt:

koble til () .use (connect.logger ()) .listen (3000);

Som standard analyserer noden svært lite av den innkommende forespørselen.

Legg den koden til filen din, og start serveren ved å kjøre node server.js. Naviger til hvilken som helst bane i nettleseren din, og ignorér resultatene "Kan ikke få ...". Vi er ikke interessert i hva serveren sendte tilbake til nettleseren; Vi er interessert i serverens logg. Se på terminalen, og du vil se loggen på dine forespørsler. Husk å sjekke ut loggerdokumentasjonen for informasjon om andre funksjoner og tilpasning.

Det var et filter; La oss nå se på en leverandør. Den enkleste leverandøren er den statiske leverandøren; Den serverer statiske filer fra en spesifisert mappe. Her er dens syntaks:

.bruk (connect.static (__ dirname + "/ public")

Du kan nok gjette formålet med Node __dirname variabel: det er banen til gjeldende katalog. Denne mellomvare serverer statisk alt fra a offentlig mappe i gjeldende katalog. Så opprett offentlig / /side.html og legg til en

element. Start serveren på nytt (node server.js), og naviger til localhost: 3000 / /side.html i nettleseren din. Du burde /side.html gjengitt i nettleseren.

La oss nå se på noen av Connects andre mellomvarealternativer.


Parsing Request Bodies

Som standard analyserer Node svært lite av innkommende forespørsel, men du kan inkludere flere forskjellige filtre for å analysere forespørselen hvis du trenger å håndtere mer kompleksitet. Det er fire filtre:

  • connect.json () analyserer JSON forespørselsorganer (hvor innholdstype er application / json).
  • connect.urlencoded () analyserer x-ww-skjema-urlencoded forespørsel organer.
  • connect.multipart () analyserer multipart / skjema-data forespørsel organer.
  • connect.bodyParser () er en snarvei for å aktivere alle de tre ovenfor.

Ved å bruke noen av disse filtrene, får du muligheten til å få tilgang til den analyserte kroppen via request.body (vi snakker om hvordan du får det be om objekt snart).

Jeg tror disse filtrene er et godt eksempel på hvordan du finfinerer kontrollen din med Connect. Du kan bruke svært lite behandling for å effektivisere applikasjonen din.


Parsing Cookies and Sessions

Cookies og økter er en viktig del av en hvilken som helst webapplikasjon, og det finnes flere biter av mellomvare som hjelper dem med å håndtere dem. De connect.cookieParser () analyserer informasjonskapsler for deg, og du kan hente informasjonskapslene og deres verdier, via Request.Cookies gjenstand. Dette er mer nyttig hvis du legger til connect.session () filtrer til appen din. Dette filteret krever at cookieparseren allerede er på plass. Her er et lite eksempel:

koble til () .use (connect.cookieParser ()) .use (connect.session (hemmelig: 'noen hemmelig tekst', informasjonskapsel: maxAge: 30000)) .use (funksjon (req, res) = req.session, url = req.url.split ("/"); hvis (url [1] == "navn" && url [2]) sess.name = url [2]; res.end navn lagret: "+ url [2]); else if (sess.name) res.write (" økt lagret navn: "+ sess.name); res.end (" lagret for en annen: "+ .cookie.maxAge / 1000) + "seconds"); else res.end ("ikke lagret navn; gå til / navn / name for å lagre et navn");).

Hver mellomvarefunksjon du skriver, må enten sende forespørselen til neste lag eller svare på forespørselen.

Etter cookieParser, vi inkluderer økt filtrer og send det to alternativer:

  • De hemmelig lager en signert informasjonskapsel som holder øye på økten.
  • De cookie.maxAge definerer levetiden i millisekunder; 30000 i denne koden er 30 sekunder.

I finalen bruk() ring, vi sender en funksjon som svarer på forespørselen. Vi bruker to egenskaper fra be om gjenstand: req.session for øktdata, og req.url for forespørselsadressen.

Hvis søknaden mottar en forespørsel om / Navn / some_name, da lagrer den verdien some_name i req.session.name. Alt lagret i en økt kan hentes i etterfølgende forespørsler om lengden på økten. Eventuelle forespørsler gjort for / Navn / annet erstatter sesjonsvariabelen, og eventuelle forespørsler til andre nettadresser utfører sessionsvariabelenes verdi og tiden som er igjen for økten.

Så kan du navigere til localhost: 3000 / navn / ditt_navn, og deretter gå til localhost: 3000 å se navnet ditt. Oppdater siden et par ganger og se på sekunder nedtelling. Når sesjonen utløper, vil du se standardmeldingen "Nei lagret navn".

Jeg nevnte at cookieParser filteret må komme før økt.

Ordren for inkludering er viktig med mellomvare fordi forespørselen er bestått, i rekkefølge, fra lag til lag.

Fordi økt trenger informasjonen om parsed informasjon, må forespørselen gå gjennom cookieParser før økt.

Jeg kunne forklare alt annet innebygd stykke mellomvare, men jeg skal bare nevne noen flere før vi skriver vår egen kode til grensesnitt med Connect.

  • komprimere: Gzip-komprimering mellomvare
  • basicAuth: grunnleggende http-godkjenning
  • katalog: katalogoppføring mellomvare
  • errorHandler: fleksibel feilhåndterer

Skrive din egen mellomvare

Du har nettopp lært hvordan du skriver din egen kode med Connect. Her er det grunnleggende syntaks igjen:

.bruk (funksjon (req, res, neste) )

Funksjonens tre parametere er viktige; de gir tilgang til omverdenen. De req parameter er selvfølgelig forespørselsobjektet, og res er svaret. Den tredje parameteren, neste, er nøkkelen til å lage funksjoner som fungerer godt i middleware-stakken. Det er en funksjon som overfører forespørselen til neste mellomvare i stabelen. Se dette eksemplet:

Koble til () .use (funksjon (req, res, neste) if (req.method === 'POST') res.end ("Dette er en POST-forespørsel"); else next ) .use (funksjon (req, res) res.end ("Dette er ikke en POST-forespørsel (sannsynligvis en GET-forespørsel)");). Listen (3000);

Denne koden bruker to mellomvarefunksjoner. Den første funksjonen kontrollerer forespørselsmetoden for å se om det er en POST-forespørsel. Hvis det er, svarer det ved å si det. Ellers kaller vi neste () og send forespørselen til neste funksjon, som svarer uansett hva. Bruk curl for å teste begge lagene i terminalen:

$ curl http: // localhost: 3000 Dette er ikke en POST-forespørsel (sannsynligvis en GET-forespørsel) $ curl -X POST http: // localhost: 3000 Dette er en POST-forespørsel

Hvis du ikke liker terminalen, kan du prøve dette nyttige Chrome-plugin.

Det er viktig å huske at hver mellomvarefunksjon du skriver, må enten sende forespørselen til neste lag eller svare på forespørselen. Hvis funksjonen din grener (via om setninger eller andre betingelser), må du sørge for at hver gren passerer forespørselen eller svarer på den. Hvis appen din henger i nettleseren, er det sannsynligvis fordi du har glemt å ringe neste () på et tidspunkt.

Nå, hva med dem be om og respons parametere? Disse er de samme forespørselen og svarobjektene du mottar når du bruker en "rå" knuteportserver:

krever ("http"). createServer (funksjon (req, res) // ...). lytt (3000);

Hvis du ikke har brukt Node server API før, la meg vise deg hva du kan gjøre med det.


Forespørselsobjektet

De be om objektet er faktisk en http.IncomingMessage objekt, og dets viktige egenskaper er oppført nedenfor:

  • req.method forteller deg hvilken HTTP-metode som ble brukt.
  • req.url forteller deg hvilken URL som ble forespurt.
  • req.headers er et objekt med overskriftens navn og verdier.
  • req.query er et objekt med data i en spørringsstreng (for å analysere det, trenger du connect.query () mellomvare på plass).
  • req.body er et objekt av skjemadataene (du trenger litt kroppsparsing mellomvare på plass).
  • req.cookies er et objekt av informasjonen om informasjonskapsel (krever parsing av informasjonskapsler).
  • req.session er et objekt av øktdataene (igjen, du må ha informasjon om kakeparsing og økt mellomvare på plass)

Du kan se alt dette på jobb med følgende kode:

connect () .use (connect.query ()) // gir oss req.query .use (connect.bodyParser ()) // gir oss req.body .use (connect.cookieParser ()) // for session .use (connect.session (secret: "asdf")) // gir oss req.session .use (funksjon (req, res) res.write ("req.url:" + req.url + "\ n \ n "); res.write (" req.method: "+ req.method +" \ n \ n "); res.write (" req.headers: "+ JSON.stringify (req.headers) +" \ n \ n "); res.write (" req.query: "+ JSON.stringify (req.query) +" \ n \ n "); res.write (" req.body: "+ JSON.stringify (req. body) + "\ n \ n"); res.write ("req.cookies:" + JSON.stringify (req.cookies) + "\ n \ n"); res.write ("req.session:" + JSON.stringify (req.session)); res.end ();). Lytt (3000);

Hvis du vil se noe for hver av disse verdiene, må du legge inn noen data til en nettadresse med en spørringsstreng. Følgende bør være nok:

curl -X POST -d "name = Ditt navn" "http: // localhost: 3000 / some / url? some = data"

Med de syv egenskapene kan du klare alle forespørsler du mottar. Jeg tror ikke tilhengere blir brukt ofte (jeg har aldri sett dem i min erfaring), men du kan bruke req.trailers hvis du forventer dem i dine forespørsler (tilhengere er akkurat som overskrifter, men etter kroppen).

Så, hva med ditt svar?


Svar-objektet

Det raske svarobjektet gir ikke den luksusen som biblioteker (som Express) gir deg. For eksempel kan du ikke svare med et enkelt gjengivelsesanrop til en premade template-i det minste, ikke som standard. Svært lite antas i svaret, så du må fylle ut alle de små detaljene.

Vi starter med statuskoden og svarhodene. Du kan sette alle disse på en gang ved å bruke writeHead () metode. Her er et eksempel fra Node-dokumentene:

var kropp = 'hallo verden'; response.writeHead (200, 'Content-Length': body.length, 'Content-Type': 'text / plain');

Hvis du trenger å sette inn overskrifter individuelt, kan du bruke setHeader () metode:

connect () .use (funksjon (req, res) var godta = req.headers.accept.split (","), body, type; console.log (godta); hvis (accept.indexOf ("application / json ")> -1) type =" application / json "; body = JSON.stringify (melding:" hallo "); annet hvis (accept.indexOf (" text / html ")> -1) = "text / html"; body = "

Hallo!

"; else type =" text / plain "; body =" hei! "; res.statusCode = 200; res.setHeader (" Content-Type ", type); res.end (body);). lytt (3000);

Legg til denne koden i en fil, start serveren og be om den fra nettleseren. Du har HTML! Kjør nå:

krølle http: // localhost: 3000

Og du får vanlig tekst. For JSON, prøv dette:

krøll -H "godta: søknad / json" http: // localhost: 3000

Alt fra samme nettadresse!

Bruk res.getHeader (navn) hvis du trenger å vite hvilke overskrifter som allerede er angitt. Tou kan også bruke res.removeHeader (navn) for å fjerne en overskrift.

Selvfølgelig er et svar ubrukelig uten en kropp. Som du har sett gjennom denne opplæringen, kan du skrive biter av data til kroppen med res.write () metode. Dette aksepterer et streng eller bufferobjekt som et argument. Hvis det er en streng, er den andre parameteren kodingstypen (den er som standard utf8).

De res.end () Metoden lukker kroppen, men du kan sende data til den for å skrive til responsstrømmen. Dette er nyttig i situasjoner der du bare trenger å utføre en enkelt linje.


Tredjeparts mellomvare

Det er noe vanskelig å svare med større HTML-kropper i vanlig gammel Node og Connect. Dette er et bra sted å kaste tredjepart mellomvare i blandingen. Du finner en liste over tredjeparts mellomvare på Connect Github wiki. Som et eksempel skal vi bruke connect-jade-pakken, som gjør at vi kan gjengi jade-visninger.

Først installer koble-jade:

npm installere connect-jade

Deretter krever og legger det til som mellomvare. Du vil angi noen standardverdier:

var connect = krever ("connect"), connectJade = krever ("connect-jade"); Koble til () .use (connectJade (root: __dirname + "/ views), standard: title:" MyApp ")) .use (funksjon (req, res) res.render (" index " : "Velkommen til min app");). Lytt (3000);

Sett roten som katalogen som inneholder visningsfilene. Du kan også angi mislighold; Dette er variabler som er tilgjengelige i alle visningene, med mindre vi tilsidesetter dem senere når de ringer render ().

Den endelige funksjonen i denne koden ringer til res.render (). Denne metoden er gitt av koble-jade pakke.

Det første argumentet det aksepterer er navnet på visningen å gjengi.

Det er banen til utsikten, sans stien som vi definerte når du legger til mellomprogramvaren, sans jade filtypen. For denne koden trenger vi en visninger / index.jade mal for å gjengi. Vi vil holde det enkelt:

html head title = tittel kropp h1 = overskrift

Hvis du ikke er kjent med jade, strekker vi inn taggenavn for å lage en HTML-struktur. Liktegnet henter verdien av en JavaScript-variabel. Disse variablene kommer fra mislighold vi satt opp, pluss det (valgfrie) andre parameterobjektet som ble sendt til res.render ().

Det er mange andre tredjeparts middleware, men de fungerer som hverandre. Du installerer dem via npm, krever dem og legger dem til handling.


Moduler som Middleware

Hvis du graver deg i hvordan Connect fungerer, vil du oppdage at hvert lag egentlig er en nodemodul - en veldig intelligent design. Hvis du bruker Koble til store applikasjoner, ville det være ideelt å skrive koden i Node-modulformat. Du kan ha en app.js filen som denne:

// app.js module.exports = funksjon (req, res, neste) res.end ("dette kommer fra en modul"); ;

Og i din server.js:

var connect = krever ("connect"), app = krever ("./ app"); koble til () .use (app) .listen (3000);

Konklusjon

Hvis du vil ha et nybegynnervennlig bibliotek som gjør det enkelt å bygge store webapper, er Connect ikke din løsning. Koble til er ment å være et tynt lag på toppen av den rå nodeprogrammet som gir deg full kontroll over serverprogrammet ditt. Hvis du vil ha litt mer, anbefaler jeg Express (av de samme folkene for øvrig). Ellers er Connect et fantastisk, utvidbart bibliotek for Node-webapplikasjoner.