Node.js este totul în buzunar în acest moment, și face ușor de înaltă performanță, în timp real aplicații web. Acesta permite ca JavaScript să fie folosit până la sfârșit, atât pe server, cât și pe client. Acest tutorial vă va îndruma prin instalarea nodului și a primului program "Hello World", pentru a construi un server de streaming scalabil Twitter.
În mod tradițional, JavaScript rulează numai în browserul web, dar recent a existat un interes considerabil în aducerea acestuia și la server, datorită proiectului CommonJS. Alte medii JavaScript de pe server includ Jaxer și Narwhal. Cu toate acestea, Node.js este un pic diferit de aceste soluții, deoarece este bazat pe evenimente, nu pe bază de fire. Serverele web ca Apache care sunt utilizate pentru a servi PHP și alte scripturi CGI sunt bazate pe fire, deoarece acestea spawn un fir de sistem pentru fiecare cerere de intrare. În timp ce acest lucru este bine pentru multe aplicații, modelul bazat pe fire nu scade bine cu multe conexiuni de lungă durată, cum ar fi de care aveți nevoie pentru a servi aplicații în timp real, cum ar fi Friendfeed sau Google Wave.
"Fiecare operație I / O în Node.js este asincronă ..."
Node.js, utilizează o buclă de evenimente în loc de fire și poate să scadă până la milioane de conexiuni concurente. Beneficiază de faptul că serverele își petrec cea mai mare parte a timpului de așteptare pentru operațiunile de I / O, cum ar fi citirea unui fișier de pe hard disk, accesarea unui serviciu web extern sau așteptarea unui fișier pentru a fi încărcat, deoarece aceste operații sunt mult mai lente decât în operațiunile de memorie. Fiecare operație I / O din Node.js este asincronă, ceea ce înseamnă că serverul poate continua să proceseze cererile primite în timp ce are loc operația I / O. JavaScript este extrem de potrivit pentru programarea bazată pe evenimente, deoarece are funcții anonime și închideri care fac definirea apelurilor inline a fi un cinch, iar dezvoltatorii JavaScript știu deja cum să programați în acest fel. Acest model bazat pe evenimente generează Node.js foarte rapid și face foarte ușoară scalarea aplicațiilor în timp real.
Node.js rulează pe sisteme bazate pe Unix, cum ar fi Mac OS X, Linux și FreeBSD. Din păcate, Windows nu este încă acceptat, deci dacă sunteți utilizator Windows, îl puteți instala pe Ubuntu Linux folosind Virtualbox. Pentru a face acest lucru, urmați acest tutorial. Va trebui să utilizați terminalul pentru a instala și a executa Node.js.
cd / calea / către / nodejs face sudo make install
O mulțime de mesaje vor fi transmise la terminal, deoarece Node.js este compilat și instalat.
Fiecare nouă tehnologie începe cu un "Hello World!" tutorial, astfel încât vom crea un server HTTP simplu care servește mesajul respectiv. În primul rând, cu toate acestea, trebuie să înțelegeți sistemul de module Node.js. În Nod, funcționalitatea este încapsulată în module care trebuie încărcate pentru a fi utilizate. Există multe module listate în documentația Node.js. Încărcați aceste module utilizând necesita
funcționează ca atare:
var sys = necesită ("sys");
Aceasta încarcă modulul sys, care conține funcții pentru a face față sarcinilor la nivel de sistem, cum ar fi ieșirea de tipărire către terminal. Pentru a utiliza o funcție într-un modul, îl numiți pe variabila pe care ați stocat modulul, în cazul nostru sys
.
sys.puts ("Hello World!");
Rularea acestor două linii este la fel de simplă ca rularea nodul
comanda cu numele de fișier al fișierului javascript ca argument.
nod test.js
Acest lucru va scoate "Hello World!" la linia de comandă când se execută.
Pentru a crea un server HTTP, trebuie necesita
http
modul.
var sys = cer ("sys"), http = necesită ("http"); http.createServer (funcție (cerere, răspuns) answer.sendHeader (200, "Content-Type": "text / html" ) .listen (8080); sys.puts ("Serverul rulează la http: // localhost: 8080 /");
Acest script importă sys
și http
module și creează un server HTTP. Funcția anonimă care a trecut http.createServer
va fi apelat ori de câte ori o cerere vine la server. Odată ce serverul este creat, i se spune să asculte pe portul 8080. Atunci când o cerere către server intră, mai întâi trimitem antete HTTP cu tipul de conținut și codul de stare de 200 (cu succes). Apoi trimitem "Hello World!" și închideți conexiunea. S-ar putea să observați că trebuie să închidem în mod explicit conexiunea. Acest lucru va face foarte ușor să transmiteți date către client fără a închide conexiunea. Dacă rulați acest script și mergeți la http: // localhost: 8080 /
în browser-ul dvs., veți vedea "Hello World!"
OK, așa că am construit un server HTTP, dar nu trimite nimic decât pentru "Hello World", indiferent de URL-ul la care mergi. Orice server HTTP trebuie să poată trimite fișiere statice, cum ar fi fișiere HTML, imagini și alte fișiere. Următorul cod face exact acest lucru:
var sys = necesită ("sys"), http = solicită ("http"), url = necesită ("url"), path = require; http.createServer (funcția (cerere, răspuns) var uri = url.parse (request.url) .pathname; var filename = path.join (process.cwd (), uri); ) if (! exists) answer.sendHeader (404, "Content-Type": "text / simplu"); fs.readFile (nume fișier, "binar", funcție (err, fișier) if (err) answer.sendHeader (500, "Content-Type" "răspuns.close (); return; answer.sendHeader (200); răspuns.write (fișier," binar "); answer.close ();););) ascultați ( 8080); sys.puts ("Serverul rulează la http: // localhost: 8080 /");
Începem prin a cere toate modulele de care avem nevoie în codul nostru. Aceasta include sys
, http
, URL-ul
, cale
, și fs
sau module de sistem de fișiere. Apoi vom crea un server HTTP ca înainte. De data aceasta, vom folosi URL-ul
modul de analiză a adresei URL de intrare a solicitării și găsirea căii de acces a fișierului. Am găsit numele fișierului real pe unitatea hard disk a serverului folosind path.join
, care se alătură process.cwd ()
, sau directorul curent de lucru, cu calea către fișierul solicitat. Apoi, verificăm dacă există fișierul, care este o operație asincronă și necesită astfel o inversare. Dacă fișierul nu există, un mesaj 404 Not Found este trimis utilizatorului și funcția revine. În caz contrar, citim fișierul utilizând fs
utilizând codificarea "binară" și trimiteți fișierul utilizatorului. Dacă există o eroare la citirea fișierului, prezentăm mesajul de eroare utilizatorului și închidem conexiunea. Deoarece toate acestea sunt asincrone, serverul este capabil să difuzeze alte solicitări în timp ce citesc fișierul de pe disc, indiferent cât de mare este.
Dacă executați acest exemplu și navigați la http: // localhost: 8080 / cale / catre / fisier
, fișierul respectiv va fi afișat în browserul dvs..
Bazându-ne pe serverul nostru de fișiere statice, vom construi un server în Node.js care transmite fluxuri către un client care este difuzat prin serverul de fișiere statice. Pentru a începe, vom avea nevoie de un modul suplimentar în acest exemplu: evenimente
modul. Nodul are un concept numit EventEmitter
, care este folosit peste tot pentru a gestiona ascultătorii evenimentului pentru sarcini asincrone. La fel ca în jQuery sau într-un alt cadru client-cadru JavaScript în care leagăți ascultătorii de evenimente de lucruri precum clicurile de mouse și cererile AJAX, Nodul vă permite să asociați ascultătorilor evenimentelor multe lucruri, unele dintre ele deja utilizate. Acestea includ fiecare operație I / O, cum ar fi citirea unui fișier, scrierea unui fișier, verificarea existenței unui fișier, așteptarea solicitărilor HTTP etc. EventEmitter
rezumă logica legării, dezbinării și declanșării unor astfel de ascultători. Vom folosi un EventEmitter
pentru a notifica ascultătorii atunci când sunt încărcate noi tweets. Primele câteva linii ale fluxului nostru tweet importă toate modulele necesare și definește o funcție pentru manipularea fișierelor statice, care a fost luată din exemplul nostru precedent.
ss = cer ("sys"), http = necesită ("http"), url = necesită ("url"), path = require "evenimente"); funcția load_static_file (uri, răspuns) var filename = path.join (process.cwd (), uri); path.exists (numele fișierului, funcția (există) if (! exists) answer.sendHeader (404, "Content-Type": "text / plain"); ; f.readFile (numele fișierului, "binar", funcția (err, fișier) if (err) answer.sendHeader (500, Content-Type " , răspuns.write (err + "\ n"); răspuns.close (); return; answer.sendHeader (200); răspuns.write (fișier, "binar"; ;);
Am folosit http
modul de a crea un server înainte, dar este, de asemenea, posibil să creați un client HTTP utilizând modulul. Vom crea un client HTTP pentru a încărca tweet-urile de pe cronologia publică a Twitter-ului, care este efectuată de către get_tweets
funcţie.
var twitter_client = http.createClient (80, "api.twitter.com"); var tweet_emitter = evenimente noi.EventEmitter (); funcția get_tweets () var request = twitter_client.request ("GET", "/ 1/statuses/public_timeline.json", "gazdă": "api.twitter.com"); request.addListener ("răspuns", funcție (răspuns) var corp = ""; răspuns.addListener ("date", function (data) body + = data; ) var tweets = JSON.parse (corp); dacă (tweets.length> 0) tweet_emitter.emit ("tweets", tweets););); request.close (); setInterval (get_tweets, 5000);
Mai întâi, vom crea un client HTTP pe portul 80 la api.twitter.com și vom crea un nou EventEmitter
. get_tweets
funcția creează o solicitare HTTP "GET" la cronologia publică a Twitter-ului și adaugă un ascultător al evenimentului care va fi declanșat când serverele Twitter răspund. Deoarece Node.js este asincron, datele din corpul răspunsului sunt în bucăți, care sunt preluate de ascultătorul "datelor" răspunsului. Acest ascultător doar adaugă piesa la corp
variabil. Odată ce toate bucățile au intrat, ascultătorul "final" este declanșat și analizăm datele JSON primite. Dacă se întoarce mai mult de un tweet, noi emite
evenimentul "tweets" de pe site-ul nostru tweet_emitter
, și treci în matricea de tweets noi. Acest lucru va determina toate ascultătorii de evenimente să asculte evenimentul "tweets" și să trimită noile tweets fiecărui client. Retrimăm noile tweets la fiecare cinci secunde, folosind setInterval
.
În cele din urmă, trebuie să creați serverul HTTP pentru a gestiona cererile.
http.createServer (functie (cerere, raspuns) var uri = url.parse (request.url) .pathname; daca (uri === "/ stream") var listener = tweet_emitter.addListener tweets) answer.sendHeader (200, "Content-Type": "text / simplu"); var timeout = setTimeout (funcția () response.sendHeader (200, "Content-Type": "text / simplu";) reply.write (tweet_emitter .removeListener (ascultător);, 10000); altceva load_static_file (uri, răspuns);) ascultați (8080); sys.puts ("Serverul rulează la http: // localhost: 8080 /");
La fel ca și în cazul serverului nostru de fișiere statice, creăm un server HTTP care ascultă pe portul 8080. Noi analizăm adresa URL solicitată și dacă adresa URL este egală cu "/curent"
, ne vom ocupa, altfel vom transmite cererea către serverul nostru de fișiere statice. Streaming constă în crearea unui ascultător pentru a asculta mesaje noi despre noi tweet_emitter
, care va fi declanșată de noi get_tweets
funcţie. De asemenea, creăm un cronometru pentru a ucide solicitările ultimei perioade de peste 10 secunde, trimițându-le o matrice goală. Când apar tweets noi, trimitem tweets ca date JSON și ștergem cronometrul. Veți vedea cum funcționează acest lucru mai bine după ce ați văzut codul lateral al clientului, care este mai jos. Salvați-o ca test.html
în același director ca și serverul JavaScript.
Tweet Streamer
Aici avem o pagină HTML simplă care importa biblioteca jQuery și definește o listă neordonată pentru a plasa tweets-ul. Partea clientului nostru JavaScript cachează lista tweet-urilor și rulează load_tweets
după o secundă. Acest lucru oferă browserului suficient timp pentru a termina încărcarea paginii înainte de a începe cererea AJAX către server. load_tweets
funcția este foarte simplă: folosește jQuery getJSON
funcția de încărcare /curent
. Când apare un răspuns, vom trece prin toate tweets și le vom preda în lista tweet. Apoi, sunăm load_tweets
din nou. Acest lucru creează în mod eficient o buclă care încarcă tweet-uri noi, care se scurtează după zece secunde din cauza timpului de expirare de pe server. Ori de câte ori există tweets noi, acestea sunt împinse către client care menține o conexiune continuă la server. Această tehnică se numește interogare lungă.
Dacă rulați serverul folosind nodul
și du-te la http: // localhost: 8080 / test.html
, veți vedea fluxul public de cronologie Twitter în browserul dvs..
Node.js este o tehnologie foarte interesantă, care facilitează crearea de aplicații în timp real de înaltă performanță. Sper că puteți vedea beneficiul său și îl puteți folosi în unele dintre aplicațiile dvs. Din cauza sistemului mare de module al lui Node, este ușor să utilizați codul pre-scris în aplicația dvs. și există multe module de terță parte disponibile pentru aproape orice - inclusiv straturi de conexiuni de date, motoare de template, clienți de mail și chiar cadre întregi care leagă toate aceste lucrurile împreună. Puteți vedea o listă completă de module pe wiki-ul Node.js și mai multe tutoriale Node pot fi găsite pe How To Node. De asemenea, vă recomand să vizionați un videoclip de la JSConf, în care Ryan Dahl, creatorul nodului, descrie filozofia de design din spatele nodului. Asta e disponibil .
Sper că v-ați bucurat de acest tutorial. Dacă aveți comentarii, puteți să lăsați unul aici sau să-mi trimiteți un mesaj pe Twitter. Nodul fericit!