Faceți cunoștință cu Cadrul de conectare

Noii veniți la NodeJS își găsesc de obicei API greu de înțeles. Din fericire, mulți dezvoltatori au creat cadre care ușurează lucrul cu Nodul. Conectați este un astfel de cadru. Acesta se află pe partea de sus a API-ului Node și trasează linia dintre confort și control.

Gândiți-vă la Conectați ca o stivă de middleware. Cu fiecare cerere, conectați filtrele prin straturile de middleware, fiecare având posibilitatea de a procesa cererea HTTP. Când T.J. Holowaychuk a anunțat Connect, a spus că au existat două tipuri de middleware. Primul este a filtru.

Filtrele procesează cererea, dar nu răspund la aceasta (gândiți-vă la logarea serverului).

Celălalt tip este a furnizor, care răspunde cererii. Puteți integra cât mai multe straturi de middleware așa cum doriți; cererea trece prin fiecare strat până când unul din middleware răspunde cererii.


Sintaxă de bază

În primul rând, trebuie să instalați pachetul Connect prin npm:

npm install connect

Acum creați un server.js fișier și adăugați următorul cod:

var connect = necesită ("connect");

conectați variabila este o funcție care returnează o nouă aplicație Connect. Deci, următorul nostru pas este să creăm acea aplicație:

var app = conectare ();

Nu este nevoie să creați un aplicaţia variabilă pentru majoritatea aplicațiilor dvs. Funcțiile implicate în crearea unei aplicații (conectați() și utilizare()) sunt flexibile:

conectați () folosiți (/ * middleware * /). folosiți (/ * middleware * /) .listen (3000);

utilizare() funcția adaugă un strat de middleware la aplicație și asculta() funcția spune aplicația noastră să înceapă să accepte conexiuni pe portul specificat (3000 în acest exemplu).

Să începem cu ceva simplu: înregistrare. Codul pentru o aplicație Connect care folosește doar mediul de logare este destul de simplă:

conectați () .Utilizați (connect.logger ()) .listen (3000);

În mod implicit, nodul analizează foarte puțin cererea de intrare.

Adăugați acest cod în fișierul dvs. și porniți serverul rulând nod server.js. Navigați la orice cale din browser și ignorați rezultatele "Nu se poate obține ...". Nu suntem interesați de ceea ce serverul a trimis înapoi la browser; suntem interesați de jurnalul serverului. Uită-te la terminal și vei vedea jurnalul solicitărilor tale. Asigurați-vă că verificați documentația înregistratorului pentru informații despre alte caracteristici și personalizare.

A fost un filtru; acum să ne uităm la un furnizor. Cel mai simplu furnizor este furnizorul static; servește fișiere statice dintr-un dosar specificat. Iată sintaxa sa:

.utilizați (connect.static (__ dirname + "/ public")

Probabil că puteți ghici scopul Nodului __dirname variabilă: este calea spre directorul curent. Acest middleware servește în mod static ceva de la a public folder din directorul curent. Deci, creați publice / pagină.html și adăugați un

element. Reporniți serverul (nod server.js) și navigați la localhost: 3000 / pagină.html în browserul dvs. Tu ar trebui pagină.html redată în browser.

Să examinăm acum câteva dintre celelalte opțiuni middleware ale Connect.


Parsarea organelor de solicitare

În mod implicit, Nodul parsează foarte puțin cererea de intrare, dar puteți include mai multe filtre diferite pentru a analiza cererea dacă aveți nevoie să faceți față cu mai multă complexitate. Există patru filtre:

  • connect.json () analizează organismele de cerere ale JSON (unde tipul de conținut este application / json).
  • connect.urlencoded () analizează x-ww-form-urlencoded solicită organismele.
  • connect.multipart () analizează multipart / form-data solicită organismele.
  • connect.bodyParser () este o scurtătură pentru a permite tuturor celor trei de mai sus.

Utilizarea oricăruia dintre aceste filtre vă oferă posibilitatea de a accesa corpul dvs. parsat prin request.body (vom vorbi despre cum să obținem asta cerere obiect în curând).

Cred că aceste filtre sunt un bun exemplu pentru modul în care puteți să vă îmbogățiți controlul cu Connect. Puteți utiliza foarte puțin procesare pentru a simplifica aplicația.


Parcurgerea modulelor cookie și a sesiunilor

Cookie-urile și sesiunile sunt o parte importantă a oricărei aplicații web și există câteva piese de middleware care ajută la gestionarea lor. connect.cookieParser () sortează cookie-urile pentru tine și poți extrage cookie-urile și valorile lor prin intermediul request.cookies obiect. Acest lucru este mai util dacă adăugați connect.session () filtrați aplicația dvs. Acest filtru necesită deja parserul cookie-urilor. Iată un mic exemplu:

(secret: 'secret secret', cookie: maxAge: 30000)) .use (functie (req, res) var sess (conect.cookieParser = req.session, url = req.url.split ("/"); dacă (url [1] == "nume" && url [2]) sess.name = url [ nume salvat: "+ url [2]); altceva dacă (sess.name) res.write (" nume stocat în sesiune: "+ sess.name); res.end .cookie.maxAge / 1000) + "secunde"); altceva res.end ("nici un nume stocat, mergeți la / nume / nume pentru a salva un nume");

Fiecare funcție middleware pe care o scrieți trebuie fie să treacă cererea la Următor → layer sau răspundeți la cerere.

După cookieParser, noi includem sesiune filtrați-l și treceți-l cu două opțiuni:

  • secret creează un cookie semnat care ține evidența sesiunii.
  • cookie.maxAge își definește durata de viață în milisecunde; codul 30000 din acest cod este de 30 de secunde.

In final utilizare() apel, trecem o funcție care răspunde cererii. Utilizăm două proprietăți din cerere obiect: req.session pentru datele de sesiune și req.url pentru adresa URL a solicitării.

Dacă cererea primește o cerere / Numele / some_name, apoi stochează valoarea some_name în req.session.name. Orice stocat în cadrul unei sesiuni poate fi preluat în cererile ulterioare pentru durata sesiunii. Orice solicitări făcute / Numele / altele înlocuiește variabila de sesiune și orice solicitare adresată altor adrese URL afișează valoarea variabilei sesiunii și timpul rămas pentru sesiune.

Deci, puteți naviga la localhost: 3000 / Nume / your_name, și apoi du-te la localhost: 3000 a vedea Numele dumneavoastră. Reîmprospătați pagina de câteva ori și urmăriți numărătoarea secundelor. Când expiră sesiunea, veți vedea mesajul implicit "fără nume memorat".

Am menționat că cookieParser filtrul trebuie să vină înainte sesiune.

Ordinea includerii este importantă pentru middleware deoarece cererea este transmisă, în ordine, de la strat la strat.

pentru că sesiune are nevoie de datele cookie parsate, cererea trebuie să treacă cookieParser inainte de sesiune.

Aș putea explica fiecare altă piesă de middleware încorporată, dar voi menționa doar câteva altele înainte de a scrie propriul cod pentru a interfața cu Connect.

  • comprimare: middleware de compresie Gzip
  • basicAuth: autentificare http de bază
  • director: directorul middleware
  • errorHandler: dispozitivul de eroare flexibil

Scrierea propriului dvs. Middleware

Tocmai ați învățat cum să scrieți propriul cod cu Connect. Iată sintaxa de bază din nou:

.(funcția (req, res, următorul) )

Cei trei parametri ai funcției sunt importanți; ele oferă acces la lumea exterioară. req parametru este, desigur, obiectul cerere, și res este răspunsul. Al treilea parametru, Următor →, este cheia pentru a face funcții care funcționează bine în stadiul middleware. Este o funcție care transmite cererea către următorul middleware din stivă. Vedeți acest exemplu:

connect () .use (funcția (req, res, urm)) if (req.method === 'POST') res.end ("Aceasta este o cerere POST" ) .use (functie (req, res) res.end ("Aceasta nu este o cerere POST (probabil o cerere GET)");)) asculta (3000);

Acest cod utilizează două funcții middleware. Prima funcție verifică metoda solicitării pentru a vedea dacă este o solicitare POST. Dacă este, răspunde așa. În caz contrar, sunăm Următor →() și transmite cererea la următoarea funcție, care răspunde indiferent de ce. Utilizare răsuci pentru a testa ambele straturi în terminal:

$ curl http: // localhost: 3000 Aceasta nu este o cerere POST (probabil o solicitare GET) $ curl -X POST http: // localhost: 3000 Aceasta este o cerere POST

Dacă nu vă place terminalul, încercați acest plugin Chrome util.

Este important să rețineți că fiecare funcție middleware pe care o scrieți trebuie fie să treacă cererea la Următor → layer sau răspundeți la cerere. Dacă funcția dvs. se încadrează (prin declarații sau prin alte condiții), trebuie să vă asigurați că fiecare ramură trece solicitarea sau răspunde la aceasta. Dacă aplicația dvs. se blochează în browser, probabil că ați uitat să suni Următor →() la un moment dat.

Acum, ce zici de asta? cerere și raspuns parametri? Acestea sunt aceleași obiecte de solicitare și de răspuns pe care le primiți când utilizați un server de noduri "prime":

cere ("http") createServer (funcția (req, res) // ...) asculta (3000);

Dacă nu ați folosit API-ul serverului Node înainte, permiteți-mi să vă arăt ce puteți face cu acesta.


Obiectul cererii

cerere obiect este de fapt un http.IncomingMessage obiect și proprietățile sale importante sunt enumerate mai jos:

  • req.method vă spune ce metodă HTTP a fost utilizată.
  • req.url vă indică adresa URL solicitată.
  • req.headers este un obiect cu numele și valorile antetului.
  • req.query este un obiect cu orice date dintr-un șir de interogări (pentru a analiza acest lucru, veți avea nevoie de connect.query () middleware în loc).
  • req.body este un obiect al datelor formularului (veți avea nevoie de un mijloc de partajare a middleware-ului în loc).
  • req.cookies este un obiect al datelor cookie (necesită parsarea cookie-urilor).
  • req.session este un obiect al datelor din sesiune (din nou, veți avea nevoie de parsarea cookie-urilor și de middleware-ul sesiunii)

Puteți vedea toate acestea la lucru cu următorul cod:

connect () .use (connect.query ()) // ne dă req.query .use (connect.bodyParser ()) // ne dă req.body .use (connect.cookieParser ()) // pentru sesiune. (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 "); res.write (" req.query: "+ JSON.stringify (req.query) +" \ n \ n "); res.write (" req.body: "+ JSON.stringify (req. ); res.write ("req.cookies:" + JSON.stringify (req.cookies) + "\ n \ n"); JSON.stringify (req.session)); res.end ();) asculta (3000);

Pentru a vedea ceva pentru fiecare dintre aceste valori, trebuie să publicați unele date într-o adresă URL cu un șir de interogări. Ar trebui să fie suficiente următoarele:

curl -X POST -d "nume = YourName" "http: // localhost: 3000 / some / url? some = data"

Cu cele șapte proprietăți, puteți gestiona orice solicitare pe care o veți primi. Nu cred că remorcile sunt folosite frecvent (nu le-am văzut niciodată în experiența mea), dar le puteți folosi req.trailers dacă vă așteptați în cererile dvs. (remorcile sunt la fel ca și anteturile, dar după corp).

Și răspunsul tău?


Obiectul răspunsului

Obiectul de răspuns brut nu oferă luxul pe care îl oferă bibliotecile (cum ar fi Express). De exemplu, nu puteți răspunde cu un simplu apel de redare unui șablon de premadă - cel puțin, nu în mod implicit. În răspuns este foarte puțin presupusă, deci trebuie să completați toate detaliile.

Vom începe cu codul de stare și antetele de răspuns. Puteți seta toate acestea simultan folosind writeHead () metodă. Iată un exemplu din documentul nodului:

var corp = 'salut lume'; response.writeHead (200, 'Content-Length': body.length, 'Content-Type': 'text / plain');

Dacă trebuie să setați individual anteturi, puteți utiliza setHeader () metodă:

(accept), dacă (acceptați.indexOf ("aplicație / json")), folosiți funcția (req, res) var accept = req.headers.accept.split "> -1) type =" application / json "; body = JSON.stringify (message: hello; else if (accept.indexOf (text / html) = "text / html"; corp = "

Salut!

"altceva type =" text / plain "; corp =" hello! "; res.statusCode = 200; res.setHeader (" Content-Type "; asculta (3000);

Adăugați acest cod într-un fișier, porniți serverul și solicitați-l din browser. Ai HTML! Acum rulați:

curl http: // localhost: 3000

Și veți primi text simplu. Pentru JSON, încercați acest lucru:

curl -H "acceptă: application / json" http: // localhost: 3000

Totul de la aceeași adresă URL!

Utilizare res.getHeader (nume) dacă trebuie să știți ce anteturi au fost deja stabilite. De asemenea, puteți utiliza res.removeHeader (nume) pentru a elimina un antet.

Desigur, un răspuns este inutil fără un corp. După cum ați văzut pe parcursul acestui tutorial, puteți scrie bucăți de date corpului cu res.write () metodă. Aceasta acceptă ca argument un șir sau un obiect tampon. Dacă este un șir, al doilea parametru este tipul de codare (acesta este implicit la utf8).

res.end () metoda închide corpul, dar puteți transmite date către el pentru a scrie în fluxul de răspuns. Acest lucru este util în situațiile în care trebuie doar să trimiteți o singură linie.


Software Middleware de la terți

Este oarecum dificil să răspundeți cu corpuri HTML mai mari în nodul simplu vechi și Connect. Acesta este un loc bun pentru a arunca middleware-ul terților în amestec. Puteți găsi o listă de middleware terță parte în wiki Connect Github. De exemplu, vom folosi pachetul connect-jade, care ne permite să facem vederi de jad.

Mai întâi, instalați-o conectați-jad:

npm instalați conex-jade

Apoi, solicitați și adăugați-l ca middleware. Veți dori să setați câteva valori implicite:

var connect = necesită ("connect"), connectJade = necesită ("connect-jade"); conectați () folosiți (connectJade (rădăcină: __dirname + "/ views", implicit: title: "MyApp")) .use (funcția (req, res) res.render : "Bun venit la aplicația mea");). Asculta (3000);

Setați rădăcina ca director care conține fișierele de vizualizare. De asemenea, puteți seta implicite; acestea sunt variabile disponibile în interiorul fiecărei vizualizări, cu excepția cazului în care le suprascriu mai târziu când sunăm face().

Funcția finală din acest cod face apel la res.render (). Această metodă este furnizată de conectați-jad pachet.

Primul argument pe care îl acceptă este numele viziunii de a face.

Este calea spre vedere, sans calea pe care am definit-o la adăugarea middleware-ului, sans extensia de fișier jad. Pentru acest cod, avem nevoie de a vizualizari / index.jade șablon pentru a face. Vom păstra simplu:

html titlu titlu = titlu corp h1 = titlu

Dacă nu sunteți familiarizați cu jad, vom indent numele de tag-uri pentru a crea o structură HTML. Semnul egal preia valoarea unei variabile JavaScript. Aceste variabile provin din implicite am setat, plus obiectul (opțional) al doilea parametru trecut la res.render ().

Există multe alte middleware de la terți, dar ele funcționează similar unul cu celălalt. Le instalați prin intermediul npm, le cereți și le puneți în acțiune.


Module ca Middleware

Dacă vă aflați în modul în care funcționează Conectarea, veți observa că fiecare strat este de fapt un modul Nod - un design foarte inteligent. Dacă utilizați Conectare pentru aplicații mari, ar fi ideal să scrieți codul în modulul Nod. S-ar putea să ai un app.js fișier ca acesta:

// app.js module.exports = funcția (req, res, next) res.end ("aceasta vine de la un modul"); ;

Și în tine server.js:

var connect = necesită ("connect"), app = necesită ("./ app"); conectați () .utilizați (app) .listen (3000);

Concluzie

Dacă doriți o bibliotecă prietenoasă pentru începători care să faciliteze crearea unor aplicații web mari, atunci Connect nu este soluția dvs. Conectarea este menită a fi un strat subțire deasupra API-ului Node raw, care vă oferă control complet asupra aplicației server. Dacă doriți un pic mai mult, vă recomand Express (de către aceiași oameni, întâmplător). Altfel, Connect este o bibliotecă fantastică, extensibilă pentru aplicațiile web Node.

Cod