>> Regulă.
Deci Cliffhanger a fost, ceea ce este node.js așa cum o știm astăzi?
Ceva? Da?
>> A fost ca un cadru de scris JavaScript
aplicații larg -
>> OK, care funcționează.
>> - Stiu ca utilizări comune, cum ar fi -
sau ceva se poate face este ca -
[Inaudibil Observație]
>> OK bun.
Da, așa că este un cadru.
Este un motor cu care te poate executa cod JavaScript
site-ul de server.
Acest lucru poate însemna simplu de lucruri
cum ar fi scris o linie de comandă script-ul nu în Python sau Bash
sau Ruby sau PHP, dar doar JavaScript în sine
și executându-l la un clipește prompt de comandă.
Sau puteți rula de fapt, se într-un server web.
Și, de fapt, în node.js în sine,
acest cadru este o grămadă bibliotecilor printre care sunt
in server HTTP built-in.
Deci, puteți scrie de fapt, un server de cum vom vedea
într-o clipă, super-ușor de doar pentru a înțelege un pic
de HTTP și TCP și porturi.
Și vă puteți ruleze o ascultare server web fără Apache,
fără IIS Microsoft.
Fără nici o altă software-ul instalat,
aveți posibilitatea să ruleze doar acest și de a asculta cele mai multe orice port
pe care sistemul ai voie să.
Astfel de caz și de puncte, lasă-mă să merg și deschideți
la acest exemplu, server-0.js.
Astfel observa că în partea de sus a acest dosar, doar o adunatura
de comentarii neinteresante, și apoi există un cuplu
de linii de cod reprezentative că vom vedea recurringly.
Deci, var HTTP devine nevoie de "HTTP".
Deci, built-in pentru a node.js " Infrastructura este o grămadă
de module care sunt de fapt doar biblioteci și tot ceea ce este un fel
de spațiu de nume cu identificatorul unic
ca aceasta este "HTTP".
Astfel că la fel ca într-o mulțime de limbi, cum ar fi Java și C + +
și C, numai atunci când importa sau includ
sau în nod vorbi necesita un modul are biții săi.
Și toate de memorie cere obține încărcat
în RAM și, prin urmare, utilizat.
Deci, ai un fel de a încărca acest biblioteci sau module la cerere.
Acest lucru înseamnă că mergeți mai departe și necesită
pentru acest program biblioteca HTTP,
și se referă la faptul că biblioteca de intermediul unei variabile numit HTTP.
Dar acest simbol stânga ar putea au fost numite nimic, foo,
bar, Baz, nu contează.
Deci, spre deosebire de C + + și Java și C în cazul în care, atunci când aveți nevoie de
sau importați o bibliotecă, doar un fel
a devine accesibil la nivel global,
module node.js sunt mai bine spațiu de nume.
Astfel încât propriu - ca funcționalitate este doar accesibil în acest moment
prin acest nume de variabilă.
Nu poți să înceapă metode de identificare care există
într-o drept un mod care este, probabil, bun,
pentru că atunci spațiu de nume dvs. nu se ajunge aproape la fel de aglomerat
ca într-o mulțime de limbi.
Bine, asa ca acum ca comun sugerează, crearea unui server HTTP
ca Jonathan [asumat ortografie] a fost posibil este literalmente
la fel de simplu ca de asteptare a crea metoda de server de interior
modulului HTTP.
Deci, aceasta se întoarce de referință
la un fel de server de web.
Ea a venit la Apache, nu greutate în mod necesar la fel de grele.
Asta e un pic mai simplu.
Și acum, am doar la pur și simplu faceți câteva lucruri.
Deci, în primul rând, permiteți-mi să derulați jos la partea de jos aici
și săriți de tratare a Metoda pentru un moment.
Și observați această linie de cod,
server.on care este înseamnă, în esență, de server -
asculta ca în cod jQuery,
asculta pentru un eveniment numita cerere
și să ia doar o presupunere ceea ce ar trebui să fac
atunci când un eveniment cerere incendii în server.
Da?
>> Apel handler funcție.
Deci, executa literalmente cod care se face referire
de această variabilă și de fapt nu o variabilă de simbol aici,
ceea ce este că simbol referindu-se?
Ei bine, acest nume de funcționeze aici
și manipulare aparent ia două argumente.
De ce două? Ei bine, dacă doar citiți documentația nu
pentru acest modul special, vă se va spune că handler
care vor fi invocate va fi au trecut cel puțin două argumente,
o trimitere la cerere,
și în interiorul Cerem înseamnă literalmente cerere HTTP.
Deci, toți cei HTTP anteturile pe care le-ar putea aminti
de la începutul anului semestru sau o clasă înainte
sau experiență asemănătoare obține linie și linia de gazdă
și linie User-Agent, toate de care este încapsulat și mai mult în interiorul
din acest obiect cereri.
Și obiectul de răspuns este clasificate în funcție de datele de ieșire.
Deci, aveți o referință la un obiecta că o să vă permite
pentru a trimite informații înapoi la browser-ul de apel metode
în acest din urmă argument numit Res pentru răspuns.
Dar acest lucru ar putea fi numit foo sau bar, acest lucru sunt doar convenții.
Deci, acum, ce să fac?
Ei bine, se pare că în interiorul de acest server web super-simplu
că eu sunt de punere în aplicare, sunt de gând să facă următoarele.
Am de gând să scrie un HTTP header cu cod de stare 200,
200 sens OK, totul este bine.
Și apoi, am de gând pentru a trece la aparent.
Care este tipul de date a al doilea argument la cap corect?
>> Este un obiect?
>> Este un obiect cu cât de multe chei și valori?
Doar unul din fiecare, drept, o valoare-cheie din pereche.
Deci, "tip de conținut".
Și singurul motiv Eu l cita aici este
deoarece cratima ar putea fi confundat un semn minus
sau ceva de genul asta.
Deci, am să-l citez aici, singe sau ghilimele duble.
Dar paradigma din nou comun
în cod JavaScript este deseori ghilimele simple aceste zile,
colon și apoi valoarea.
Deci, aceasta este doar așa-numitul tip minte.
Acesta este un antet HTTP care este literalmente merge
să fi conținut de tip cratimă colon Textul slash clar că se întâmplă
să fie trimise de la server pentru browser-ul
astfel incat browser știe dacă pentru a rula acest text ca Raw
sau HTML sau ca o imagine sau un film
sau un fișier flash sau nimic altceva.
Acum, unde vreau de fapt pentru a trimite în corpul paginii?
Ei bine, doar de lectură documentația
pentru obiect răspuns în interiorul acestei biblioteci.
Văd că există un drept metodă și care ia un șir,
poate alte lucruri, dar minim un șir.
Iar șirul este ceea ce este scuipa la browser-ul.
În acest caz, super-sale simplu, lumea sa salut,
dar ar putea fi opne suport, html, suport aproape,
cap suport deschis, aproape Suport și așa mai departe,
acest lucru ar putea fi html Raw.
Dar suntem păstrarea exemplul simplu de doar scuipa
din cele mai simple de tipuri de minte care este, fără îndoială, text / plain.
Și apoi response.end doar înseamnă a închide conexiunea
și trimite tot ce am un fel de tampon în interiorul
din acest obiect înapoi la browser-ul.
Am terminat. Bine.
Deci, ultimul lucru Fac aici
și acest lucru este oarecum arbitrar și menit să fie rece,
este că spun de server în cele din urmă pentru a asculta
pe un anumit TCP prin portul implicit.
Amintesc de la început de clasă care servicii -
sau tu de obicei unic identifica prin numere,
AD este web-ul, 443 se bazează HTTP site-uri web, 22 este SSH, 21 este FTP
și 1337 este doar arbitrară dar e mai mare decât 1024
ceea ce înseamnă în cele mai multe sisteme, pot folosi
fără a avea nevoie de super- privilegii de utilizator.
Deci, este doar convenabil.
Dar 8080 este în afara - o comună unul, 8088, într-adevăr ceva mare
în mii ca comun dar acest lucru este doar mai mult de elita.
Bine, deci ceea ce se întâmplă când am fugi de fapt acest lucru?
Ei bine, eu nu doar vizita pagina într-un browser.
Acest fișier se numește server 0.js.
Pentru că, din nou, Apache este acum din imagine
pentru a doua jumătate cursului.
Dacă vreau să web de server, am nevoie pentru a scrie
și apoi executați acest server web.
Dar se pare că JavaScript atât pe partea de client
și partea de server este un limbaj interpretat.
Deci, tot ce am nevoie este un interpret.
Deci, e - în cazul în care insista pentru a rula nod si apoi server 0.js,
Eu pot sau nu pot vedea unele de ieșire în funcție de
în ceea ce bibliotecile am inclus, nimic nu pare sa se intample.
Dar lasă-mă să merg la o browser-ul și dă-mi drumul
la aceeași adresă IP dintre clientii mei CS50.
Dar acest lucru ar putea doar la fel de bine să fie Mac mea
sau PC-ul meu și apoi apăsați enter.
Care de fapt arata ca Apache.
Asta e ca și cum directorul listare ne-am uitat
la în prima jumătate a anului.
Deci, ceea ce am făcut greșit?
Da.
[Inaudibil Observație]
Exact, corect?
Deci, Apache este încă de ascultare pe de portul implicit 80.
Chiar dacă am putea schimba asta, Am putut opri toate împreună
dar este încă în desfășurare.
Dar tipii ăștia pot cu siguranță coexista.
Trebuie pur și simplu să pună colon 1337 și apoi, poate,
sau poate nu o bară oblică la final pentru a accesa acest port
că acest server se execută pe.
Și acum văd că Bună ziua, lume a revenit.
Și pot lovi la fel de reîncărcare de multe ori ca vreau,
este încă servește o pagină.
Într-adevăr, dacă am deschide Chrome inspector, du-te la rețea
și apoi reîncărcați întreaga pagină,
observă că, într-adevăr aceasta a fost cererea care a fost trimis.
Dacă mă uit la sursa Raw,
observa browser-ul meu trimite toate aceste lucruri.
Și apoi răspunsul de la serverul a fost super simplu.
Există 200.
În cazul în care nu e prea mic pe ecran,
nu este tipul de conținut.
Și apoi node.js un fel de automat
pentru mine a adaugat la data și toate celelalte lucruri
ca browsere se așteaptă de obicei.
Deci, să vedem doar o puțin de verificare bun-simț.
Lasă-mă să mă întorc la codul în server 0.js și lasă-mă -
fiecare dată când mă duc în handler,
permiteți-mi să spun doar console.log.
("Am avut un vizitator!").
Nu am nevoie să recompilați sau ceva de genul asta,
este un limbaj interpretat.
Deci, acum, permiteți-mi să mă întorc la pagina, reincarca unul, doi,
de trei ori și du-te înapoi la fereastra mea.
Și acum văd asta.
Ei bine, asta e ciudat, Văd șase linii.
Interesant trivia web, de ce a făcut Am primi șase cerere nu trei?
Da?
[Inaudibil Observație]
Da. Deci, după cum probabil știți mic icon prost în partea de sus
din bara browser-ului că o mulțime
de site-uri s-ar putea folosi fi o creastă de la Harvard,
ar putea fi logo-ul companiei sau ceva de genul asta.
Deci, browsere in aceste zile un fel
face de îndrăzneală o cerere suplimentară HTTP
la aproape fiecare site-ul care să vizitați a verifica dacă există
în mod implicit un fișier numit favicon.ico
în același director ca și fișierul solicitat.
Și dacă este așa, se pune pictograma acolo.
Deci, tot ce vedem este exact asta.
Și, de fapt, să vedem dacă ne-am Puteți vedea acest lucru, mai degrabă decât de tip
la doar, "Am avut un vizitator".
Lasă-mă să merg mai departe și de ieșire.
Și eu știu doar de la acest uita la documentația.
Există o proprietate în interiorul Obiectul cererii numita URL
care se întâmplă să fie calea
care a fost solicitată în URL-ul real.
Deci, dacă am reporniți serverul pur și simplu de a executa din nou nodul
de pe server-0.js și acum face acest una, două,
trei și du-te înapoi aici.
Nu este.
Slash este ceea ce am - umane solicitată
în favicon.ico este ceea ce browser-ul este
îndrăzneală solicitant.
Dar punctul nu este lucruri atât de mult favicon
dar modul în care este operat pe server.
Da?
>> De ce are asta de- să fie o cerere?
>> De ce are asta de-a - prin natura cum funcționează HTTP.
Deci, HTTP poate solicita numai un fișier la un moment dat.
Browsere pot fi inteligent aceste zile
și să păstreze TCP conexiune deschisă.
Dacă ați luat CS143 sau, în general, familiarizat cu crearea de rețele,
astfel încât să puteți obține câștiguri de eficiență
prin menținerea rețelei socket deschis
în a face HTTP multiple cereri de seriale de peste ea
dar ele sunt un singur fișier pe cerere.
Deci, dacă vizitați ceva de genul -
Adică putem merge la cele mai multe orice site-uri web.
Dacă te duci la - să trage în sus inspector aici Chrome.
Se poate obține umple cele mai multe paginii.
Du-te la tab-ul de rețea și du-te la www.cnn.com.
Și atunci când vizitați cnn.com, pagina sa -
browser-ul dvs., mai degrabă atroce face - încă de numărare.
OK. Cel puțin 289 HTTP cereri din nou și din nou.
Și acesta este motivul, atunci când vizitați site-uri deosebit de umflat,
acestea sunt lent pentru a încărca din cauza tuturor
din activele ei de încărcare.
Deci, se pare ca 298.
Ar putea exista unele Ajax întâmplă în acest moment sau unele
din activele sunt doar reduse.
Deci, fiecare dintre acestea este o cerere individuală merge înapoi
și înapoi, înainte și înapoi.
Și de aceea mai devreme, chiar deși am un fel de vorbit
despre ea oarecum fancifully unde mai pui tag-ul script-ul,
absolut face o diferență atunci când aveți -
ea începe să aibă o mulțime de trafic și o mulțime
fișiere de a fi solicitat.
Și fiecare din acestea reprezintă probabil, o imagine, un fișier media,
un fișier JavaScript, CSS fișier sau altele asemenea.
Deci, suntem deja până la unele 4 megabytes doar
să se uite la știri astăzi.
Bună întrebare.
Bine.
Deci, ce sunt unele dintre upsides deși?
Drept, știm cum să facă pagini Web deja cu PHP.
Și mulți dintre voi ați venit în a clasa știind Django
și Python sau șine cu Ruby.
Deci, de ce avem nevoie de încă un alt limba și infrastructură?
Ce este deosebit de node.js bun la, dacă știi?
[Pauză]
Ceva?
Nu? Da?
>> Retransmiterea de mesaje.
>> Deci, retransmiterea de mesaje.
Deci, asta e adevărat și că e adevărat pentru un motiv mai tehnic
și că node.js și într-adevăr JavaScript este deosebit de
bine-potrivite pentru asincron cod,
dacă prin creați iluzia
de a face mai multe lucruri de la o dată.
Deci, chiar dacă ele sunt întâmplă cu adevărat în serie,
într-adevăr, în cele mai multe cazuri, JavaScript atât partea de client
și partea de server este singur filetat.
Care, dacă sunteți luați 161 sau chiar 61 înseamnă că -
acestui program știu,
interpretul poate literalmente doar faci un singur lucru de la o dată.
Dar acest lucru este nu este mare pentru ceva ca un server web
în cazul în care s-ar putea avea zeci sau sute sau poate chiar mii de
din utilizatorii de toate încearcă pentru a accesa pagina dvs. de Web
în același timp.
Și totuși, care sugerează că care unul le manipulează
după celălalt după altele mai ales în cazul în care unele
a celor cerere așa cum am văzut pe CNN ar putea avea nevoie de servire
până la 300 de fișiere înainte de a vă chiar ajunge la următorul utilizator
care vrea să vadă, spune știri.
Node.js este mai potrivit pentru medii de genul asta.
Pentru că ceea ce se întâmplă este orice proces care rulează lent
ca citirea unui fișier de pe disc sau interogarea unei baze de date sau vorbesc
la un alt server de rețea,
care tinde să aibă latență, corect?
Dacă ați avea 61 sau 161 mai ales toate de acest fel
de servicii periferice tind să fie mult mai lent
decât a face ceva în interiorul RAM aceeași și același procesor
care spune, în acest caz, server este de fapt rulează.
Dar ceea ce este frumos despre node.js este că puteți -
și JavaScript, mai general, este că puteți face ceva
și apoi spune, "Hmm, acest lucru se întâmplă
să-mi ia câteva milisecunde sau chiar câteva secunde.
Permiteți-mi fel de furculiță care off, " dar nu este un proces adevărat.
Și atunci când se face face proces care rulează ca lent
ca hapsân rânduri de la un baze de date sau citirea unui fișier. html
de disc, se va ma intorc la mine, mai degrabă
decât mine a fi nevoie să așteptați pentru ea.
Deci, pentru a face acest lucru mai clar.
Acest lucru este mijloacele mele de face acest lucru mult mai familiar.
În regulă, astfel încât acesta este Se agită Shack în piață.
Aceasta este un fel de paradigmă comun
pentru a explica asynchronicity.
Aceasta este de fapt un bun de exemplu, pentru că Shake Shack
și Burger gustoase sunt extrem de lent pentru ceea ce fac.
Dar ideea este că sunt foarte bun la preluarea comenzilor
și luând banii după care vă așteptați pentru mâncare.
Deci, aceasta este de fapt o mai bună Design decât alternativa.
Pentru că presupunem că intri în un magazin ca asta și te-ai
la partea din față a liniei și tu plasat comanda dumneavoastră și doriți
la burger, cât de bine pot spune, este nevoie de cel puțin cinci
sau mai multe minute pentru a obține de fapt, un burger.
Deci, ar fi un fel de un model de afaceri de rău
dacă în timp ce sunteți în așteptare pentru dvs. burger, Alice [asumat ortografie]
și Bob [asumat ortografie] și Charlie [asumat ortografie]
și toată lumea este coadă în spatele tău
și vă sunt literalmente de blocare linia de așteptare pentru mancarea ta.
Deci, evident, la Shake Shack
și alte fast-food locuri nu face acest lucru,
fac ceva de genul asta.
Ei vă dau un buzzer.
Și ei un fel de va trimite pe drumul tau.
Și ei te sun înapoi de face acest mic vibreze lucru
sau flash pentru a obține atenția dumneavoastră.
Deci, aceasta este literalmente ceea ce?
Ceva de genul node.js face.
Dacă node.js sau JavaScript în general este utilizat
și programator este suficient de inteligent
pentru a realiza, "Știi ce?
Orice am nevoie pentru a face dreptate aici ar putea avea un numar
de milisecunde sau secunde.
Știi ce?
Lasă-mă să merg mai departe și nu numesc sincron -
"Care este tipul de blocare toată lumea în linie, "-
lasă-mă să merg mai departe și un fel de la o parte
și pur și simplu mă suna înapoi
în momentul în care rulează mult timp operațiune este completă. "
Și suna din nou, desigur, face aluzie în acest caz,
pentru o funcție de apel invers, o referire la o mandrină de cod
care va fi executat atunci când burger-ul este gata,
mult ca acest lucru să aibă o anumită un fel de funcționalitate built-in
că aceasta începe vibratoare sau zumzet atunci când este timpul pentru tine
să fie numit din nou la față a liniei.
Deci, ceea ce face acest înseamnă, în termeni reali?
Ei bine, trebuie să ne să urcăm în sus.
Deci, lasă-mă să merg mai departe și de a face acest lucru în primul rând.
Pe server-1.js, permiteți-mi să Primul simplifica codul
astfel încât să putem lua măsuri pentru copii față de o problemă mult mai convingătoare.
Acest lucru este exact la fel program pe care l-am scris înainte.
Dar ceea ce a fost schimbat?
Există un fel de ușoară diferență sintactică
între aceasta și Versiunea 0 în urmă cu o clipă.
Ceea ce sare la vă dacă vă amintiți?
Da, Cynthia [asumat ortografie]?
[Inaudibil Observație]
Da. Deci, acum, avem o linie Funcția de a fi trecut inch
Ne-am scapat de acest gen
de inutil numit funcția handler.
Inutil numai în că, înainte de chiar de asteptare într-un singur loc,
Nu am nevoie să pierdem timpul dându-i un nume
și-l face mai greu pentru a citit cod în partea de sus în jos.
Deci, hai să declare în linie este o funcție anonim.
Și eu fac alte două lucruri.
Fac mai bine utilizarea de notație punct.
Deci, ca și în jQuery, o mulțime de nod metode pot fi legate împreună.
Astfel că, odată ce ai terminat de asteptare ceva, nu aveți
să aștepte la o nouă linie și de apel o altă metodă,
puteți doar lanț le împreună.
Și în acest fel, putem într-adevăr strânge asta.
Deci, aceasta este literalmente o server de web în cinci rânduri
din cod totală spre deosebire de -
spre deosebire de ceea ce s-ar putea în mod normal trebuie să faci pentru a stabili ceva.
Dacă mă duc într-un server 2 acum, hai să facem asta.
In server de 2 - de fapt să reveni la acel server 2.
Să deschidem acum asincron-0.js și aborda această problemă la îndemână.
Deci, în primul rând, să mergem înainte și deschis
up asincron-0.js în browser.
Așa asincron-0, dă-mi drumul înapoi la browser-ul.
Lovit reload.
Iar acum, acest lucru este un fel de mesaj de eroare.
Într-adevăr, am văzut un 500 în inspector Chrome.
Dar permiteți-mi să mai precis solicita hello.txt.
OK. Deci, acest lucru pare să funcționeze.
Așa asincron-0.js nu pare să servi ceva de slash.
Nu are nici un sprijin implicit de fișier.
Dar dacă am în mod explicit solicita hello.txt,
care pare a fi de sprijin.
De ce este asta?
Ei bine, ce am plecat de aici
și a făcut este implementat un server web super-simplu
care demonstrează în cazul în care asynchronicity poate fi util.
Și care este pusă în aplicare după cum urmează.
În primul rând, eu sunt, folosind Modul HTTP din nou,
dar, de asemenea, FS care probabil vine de la?
În general, în CS, sistemul de fișiere.
Sistem de fișiere OK.
De aici mai departe FS, sistemul de fișiere.
Bine, deci ce face acest lucru dă-mi?
Funcționalitate aferente fișiere, cum ar fi obtinerea trecut,
deschiderea fișierelor, scriind directoare, directoare de lectură
și tot de acest gen de lucruri.
Deci, acum observa, acest cod este la fel ca înainte,
a crea server, care trece într-o funcție anonim.
Aceasta este un fel de arbitrar.
Acesta nu este un foarte server web sigur.
De fapt, ai putea accesa cele mai multe orice fișier de pe hard-disk
sau pe serverul e greu conduce prin executarea acestui cod
pentru că eu sunt doar orbește presupunând că am de gând
pentru a apuca orice utilizator a solicitat în URL-ul.
Și am de gând să prefix cu dot
așa că eu sunt marginal fiind sigur
prin a spune orice fișier ce pot cerere are cel puțin la început
din directorul curent.
Desigur, există o amenințare aici.
Pentru că în cazul în care în loc de includ ce?
În calea lor, ei pot fel de a rezolva asta.
Dot, dot, corect?
Deci, în cazul în care utilizatorul a pus doar punct, punct în URL-ul, în teorie,
acestea ar putea începe obtinerea mea - și spune fișier parola.
Deci, acest lucru nu este menit să fie asigurată,
este menit să fie simplu.
Deci, aici, am o variabilă care este concatenarea dot
care este directorul prezent și URL-ul cerere
pe care am văzut înainte este ca slash sau / hello.txt.
Deci, acum, ea devine o pic mai interesant.
În primul rând, observa în partea de jos.
Ascult pe același port, înainte.
Deci interesant reală lucru este în interiorul de aici.
De fiecare dată când o cerere vine de natură
din acest cod, ce fac?
Am sunat fișier metoda cu fișier de citire de sistem,
trece în calea pe care vreau să citesc.
Iar acum, acest lucru este ceea ce este interesant aici,
acest lucru este de punere în aplicare în metoda asincron.
Nu se poate obține un profit valoare din fișier citire.
În avizul fapt, există expresie nu stânga
în partea stângă a fișierului citire.
Ea nu se întoarce o valoare.
Mai degrabă, se numește un apel invers funcționeze atunci când este gata
pentru a vă oferi înapoi un răspuns.
Deci, din nou, să fie clar, în timp ce în odinioară,
în multe programe limbi, dacă ai vrut
pentru a citi un caz fișier La punctul PHP,
fișier de subliniere a obține subliniere conținut,
aveți o expresie stânga în toată valoarea după -
înainte de semnul egal, înseamnă că sunteți atribuirea
pentru că variabila revenirea Valoarea acestei funcții.
Puteți face acest lucru în node.js, dar de obicei au
pentru a apela în mod explicit sincron versiuni de funcții cum ar fi,
Cred că e citit de sincronizare fișier sau sincronizare citit dosarul.
Am uitat cum l-au numit.
Și care ar da vă o valoare de retur.
Dar dacă acel fișier este pe un sistem de fișiere de la distanță
sau disc este doar natural lent, ar putea dura 10 de milisecunde
sau două secunde pentru ca fișier pentru a veni de fapt, înapoi.
Între timp, nici un alt web vizitatorii sunt deservite
prin website-ul dumneavoastră.
Ești de blocare.
Asta e ceea ce se numește blocarea IO, de intrare / ieșire.
Deci, aici, acest lucru este mult mai inteligent.
Pentru că ceea ce se întâmplă node.js
să facă la interpretarea este următorul,
se va apela metoda cu fișier de citire,
încercați să o sus dosar care are o cale specificată de valoarea P.
Și apoi, dacă și atunci când este gata pentru a vă da înapoi conținutul
din dosar P, se va apela o funcție a cărui semnătură este
prin convenție următoarele.
Două argumente, primul dintre care este, poate, un obiect de eroare,
E de capital, este un obiect numit de eroare sau Null
în cazul în care nu există nici o astfel de eroare.
Și al doilea argument - să ia o presupunere - va fi ce?
Se numește de date în mod evident, dar ceea ce este de date mai concret?
>> Cuprins?
>> Conținutul hello.txt în exemplul am tras
în browser-ul meu acum o clipă.
Deci, cu alte cuvinte, de a citi fișier și multe node.js funcții
ca nu se mai întorc la valori.
Ei numesc callback și trece
la aceste callback ce ar fi au fost în mod tradițional
valoare reveni.
Partea buna a acestei abordări este
care s-ar putea numi citit dosarul un T0.
Funcție de apel invers puterea nu poate fi numit un tick mai târziu
ca să spunem așa, la T, ea ar putea fi numit un T1000,
o mie de căpușe mai târziu.
Dar ideea este că restul de cod în acest fișier,
în cazul în care orice ar fi imediat fi executate în timp ce node.js
și în timp ce sistemul de fișiere seama cum de a citi
acel fișier și de a lua l înapoi la tine.
Astfel încât să creeze acest lucru -
atât de eficient iluzia
de paralelism în timp ce permițându- procesele de funcționare mai lent nu este
bloca lucrurile importante, partea care service utilizatori.
Deci, cum putem ocupe de acest lucru?
Aceasta este o foarte frecvente paradigmă node.js.
Și există cale doar pentru a simplifica aceasta este vom vedea înainte de-a lungul.
Am verificat mai întâi dacă Eroare nu este nul.
Deci, în cazul în care aceasta nu este fals apoi a fost o eroare.
Nu știu ce este că, poate că fișierul nu există.
Nu am avea permisiuni.
Calea este greșit.
Orice număr de lucruri ar putea merge prost.
Pentru moment, am de gând să arbitrar reveni 500
care este eroare de server intern.
Ceva a mers prost.
Nu-mi pasă cu adevărat pentru a diagnostica.
Deci, hai să spunem utilizatorul este rupt.
Și apoi, am de gând pentru a face res.end,
și acest lucru este notație prescurtare.
Amintiti-va ca ultimul timp am făcut res.write
și apoi am făcut res.end.
Dacă doriți doar să trimite o linie de ieșire,
puteți face totul doar dintr-o dată cu res.end cu un argument,
și că va trimite indiferent de mesajul de eroare este
în interiorul acestui obiect la browser-ul.
A fost destul de arc amintesc acum o clipă.
Nu am nici o idee despre ceea ce acest însemna la prima vedere.
Dar când am cerut o fișier care nu exista -
Oops, am nevoie pentru a rula serverul din nou.
Când am cerut un fișier că nu exista, EISDIR,
așa ceva despre ea fiind director,
dacă am face unele aleatoare șir acolo,
se pare că înseamnă fișier nici macar nu exista.
Și asta pentru că codul meu se spune pur și simplu de a scrie
în orice Raw Mesaj de eroare este,
deci nu foarte ușor de utilizat dar cel puțin eu o manipulare.
Altfel, în cazul în care acesta nu a fost un eroare ce fac?
La fel ca înainte scuipat un 200 OK, un simplu -
text / tip de minte și simplu apoi scuipat afară de date.
Și de aceea eu sunt obtinerea de conținutul hello.txt care doar
pentru a confirma dacă m-am uitat la hello.txt,
e literalmente doar Bună ziua, lume.
Și dacă am schimbat acest lucru Bună ziua, lume, salvați fișierul,
rulați din nou la server, reîncărca pagina.
Acum, am lua această versiune.
Deci, am de fapt doar reimplementat un server de web
ca este a existat pentru multe ani, dar folosind node.js.
Dar putem face acest lucru chiar mai curat.
Lasă-mă să deschid asin-1.js.
Acum, observa adaug un alt modul de această dată,
aparent modulul cale.
Acum, acest lucru este un bun posibilitatea de a privi
la ce documentația arata ca.
Node.js este documentația.
Ca PHP cred că este de fapt, destul de bine
și drept înainte.
Dacă mă duc la node.js și Google și caută calea node.js,
ceea ce veți vedea, de obicei, este o legătură directă cu un URL
că am pus aici acum o clipă.
Deci / API este locul oficial pentru a merge pentru documentare.
Și ceea ce veți vedea în partea de sus
de documente oficiale nod este toate metodele și
sau proprietăți interiorul acest modul special,
dintre care unul este numit adere.
Și să se alăture este funcția de ajutor că o să-mi permiteți
să nu deranjeze cu toate plusurile.
Și le-a adăugat bonus așa cum veți vedea
de la docuri este, de asemenea, normalizează calea rezultat.
Deci, în cazul în care utilizatorul sau aveți puncte sau puncte dot sau orice combinație
dintre aceste tipuri de relativă căi, printre upsides
metodei alăturat este că se va curăța toate că până
și vă va oferi un canonic cale fără nici
din aceste puncte sau puncte dot.
Deci, este un lucru bun în generală de securitate cel puțin
dacă sunteți de verificare Valoarea reveni pe care eu nu sunt
în acest caz simplu particular.
Dar am vrut să-l folosească.
Deci, am crea acum de cale puțin mai mult programatic
cu path.join loc de concatenare Raw.
Deci, care e un pic mai curat decât înainte.
Și acum observați eu fiind un putin mai inteligent, mai degrabă
decât doar orbește încercați să citiți fișierul,
Am de gând să de fapt, apel fs.stat.
Deci, daca esti familiar
cu nivel scăzut C funcții și C, chiar PHP.
O mulțime de biblioteci au această funcție returnează STAT
în esență, statistici pe un fișier, dimensiunea fișierului,
permisiunile, numele și lucruri de genul asta,
și, de asemenea, implicit dacă fișierul există sau nu,
și dacă este un fișier sau director
sau link-ul simbolic sau altceva.
Deci, acum observa, sunt asteptare fs.stat.
Și apoi se pare potrivit la documentația,
Ar trebui să mă întorc în obiect Eroare
sau Null urmat de un obiect statistici.
Dar haideți să verificați acest lucru, node.js.fs.
Aici este fișierul Documentația sistemului.
Să mă uit la statistici.
Există o mult mai mult funcțiilor aici.
Oops, că sincronizare stat, fs.stat.
Deci, aici, e asincron statistici (2).
Asta e ceea ce înseamnă, dacă amintiți-vă de la paginile principale,
capitolul 2 din pagina principală,
înseamnă că aceasta este literalmente doar un nod de punere în aplicare
a-nivelul scăzut functionarea sistemului stat.
Deci, callback devine două argumente, eroare și stat
unde este un stat fs.stats obiect.
Deci, haideți să vedem ce acest obiect ar trebui să arate.
Să faceți clic pe hyperlink și văd că.
Obiectul statistici conține se pare o metodă ajutor,
este fișier, este director, este o grămadă de alte lucruri.
E "este" fișierul care îmi pasă despre, în acest caz particular.
Deci, aici mă duc.
Dacă a existat o eroare, atunci permiteți-mi să salveze acest moment
și să își asume.
Dacă există o eroare, a fost probabil un fișier de 404 nu a fost găsit.
Ar putea fi altceva
dar am fi un pic leneș aici doar să se concentreze
pe cele mai interesante detalii.
Dar pentru utilizator scopuri, fișier nu este găsit,
în cazul în care nu a existat nici o eroare precizând fișierul.
În caz contrar, permiteți-mi să verificați dacă fișier este într-adevăr un fișier real.
Deci, dacă aceasta nu este o fișier, ea există.
E ceva acolo, dar este, probabil, un director
sau, poate, o legătură simbolică
sau altceva care este funky, pe sistemul de fișiere.
Fie un fel, utilizatorul ar trebui să nu-l vadă.
Deci, acum, eu sunt doar de gând să scuipe
în mod convențional neautorizate 403.
Dar, din nou, doar o convenție,
Am fi putut folosi altceva în teorie.
Și apoi în cele din urmă, permiteți-mi să încercați să citiți fișierul.
Deci, lasă-mă să derulați în jos.
Și acum observa acest lucru este în cazul în care codul poate obține un pic murdar,
observa că am sunat fs.readFile trecere
în aceeași cale, aceeași apel invers ca ultima dată,
astfel încât versiunea anterioară.
Și apoi, dacă aș găsi -
dacă eu nu-l găsiți, Am scuipat din 500.
Și dacă eu nu-l găsiți, ce linie vom vedea aici?
Vom vedea FS Trimite antet 200, probabil,
și un res.end trimiterea datele reale.
Dar observa acest lucru.
Și acest lucru nu este demonstrativ de scenariul cel mai rău caz.
Dar am acest apel stat aici decât am niște chestii.
Apoi, am o altă asincron apel aici,
cu atât mai mult indentare.
Deci, doar un fel de a extrapola dacă ai putea de aici.
Ce problemă tinde să apară cu limba ca JavaScript
în acest mediu în care nu au valori de retur
ci mai degrabă ai aceste callback.
Și, desigur, aceasta este doar un lucru stilistic faptul
că am ține crestarea.
Dar ia aceasta la următorul pas logic.
Să presupunem că au existat unul sau alte două sau trei funcții
pe care am nevoie pentru a executa care au fost de natura asincron,
și prin urmare, doar un fel de păstra crestarea să se ocupe de,
să se ocupe de ei, să se ocupe de ei.
Ai un fel de apel invers iad ca oamenii o numesc
în cazul în care codul începe pentru a obține foarte larg
sincer și într-adevăr greu de citit.
Așa cum este, am putea fel de abia spune că aceasta este un fel de flux
care are acest tip
din punct de vedere stilistic în unghi lucru se întâmplă aici.
Deci, acest lucru nu este ideal, deoarece acest lucru poate deveni foarte repede
greoi, chiar dacă două asincron nu solicită
o astfel de afacere mare.
Deci, am putea evita acest lucru, nu?
Este posibil să fi zărit că Am misclicked acum o clipă.
În documentația, stii, se pare ca nu este statSync.
Și statSync nu ia un apel invers ca un argument.
Este nevoie de doar calea pentru ca se pare că ceea ce face?
Returnează o instanță de fs.stats.
Deci, acest lucru ar putea fi dvs. primul instinct, nu?
Mai ales în cazul în care funcțiile de apel invers
și asynchronicity este o puțin nou pentru tine, sincer,
cea mai simplă abordare este, probabil, doar evita problema tuturor
împreună, du-te înapoi pentru a sorta de programare stil CS101
unde te sun funcție sau metoda, returnează valoarea,
apel de funcție, se întoarce valoarea,
funcție, returnează valoarea.
Și am putea folosi, prin urmare, fs.statSync
care este literalmente la fel dar este o versiune sincron
ceea ce înseamnă că se întoarce valoarea.
Acesta nu trece o valoare pentru un apel invers.
Dar de ce ar fi asta, probabil, un soluție suboptimală să recurgă
a funcțiilor sincrone?
Da?
[Inaudibil Observație]
Exact, este nevoie de o perioadă lungă de timp.
Esti doar încetinirea totul jos.
Pentru că la fel ca Shake Shack sau Burger gustos, în cazul în care s-au descotorosit
de aceste sonerii și ați făcut, clientul sta în față
de linie până când mâncarea ta este gata chiar înainte de a lua comanda
persoanei din spatele , evident,
prin pune încetinește.
Oamenii încep pleca, ce fel de remiză pachete.
Puteți face orice număr de analogii aici.
Dar, în scurt, este probabil, nu un lucru bun
pentru afaceri sau pentru server.
Codul astfel asincron este de obicei bun, cel puțin
în acest caz, dar cu siguranta începe să provoca unele Angst.
Și, de fapt, îndrăznesc să spun că, atunci când scris primul chestia asta,
va lua un pic bit de a fi utilizate pentru.
Deci, să începem să doteze vă cu unele biblioteci
și tehnici pentru a face acest lucru un pic mai ușor.
Deci, unul dintre cele mai comune bibliotecile sunt biblioteci populare
aceste zile, aceasta unul numit async.js.
Și, ca o mulțime de node.js biblioteci sau module,
acestea sunt toate open source.
Ei trăiesc și de a lua aproape toate depozite hub, care este un fel
a devenit de facto loc pentru a stoca aceste lucruri.
Și apoi există o infrastructură întreg
pentru instalarea acestor lucruri numit NPM, Node Package Manager
care daca esti familiar cu EvanTube este un fel
de app cum ar fi sau app obține.
Dacă sunteți familiarizat cu Red Hat și Fedora
ca în aparat, e ca yum.
Dar e un nod - e un manager de pachete doar
pentru acest mediu special.
Deci, putem descărca și instala lucruri cum ar fi biblioteca asincron
și, de asemenea, o alta numită sublinia bibliotecă sau modul.
Dar aceste fs în măsura, HTTP, cale,
acestea sunt toate vin construit în la nod.
Deci, dacă mergem la docs API, veți vedea că de fapt construit
în nod te gratis o grămadă de module.
Dar o multime de oameni draguti pe internetul au făcut zeci
dacă nu sute de alte biblioteci
pentru a face lucrurile mai bine sau în mod diferit.
Deci, haideți să aruncăm o privire la cum funcționează această bibliotecă.
Deci, cele mai multe din acest cod este identic pentru moment.
Eu am o cale de a fi a creat până sus.
Și acum am sunat async.series.
Deci, biblioteca asincron, este doar o bibliotecă, care vă permite
pentru a trece sau crește în mod obișnuit de funcții pentru a obține numit unul
după celălalt doar la fel de evita această problemă indentare,
și într-adevăr doar mentale Angst, care va apărea în mod invariabil
cel puțin atunci când primul se arunca cu capul în a acest lucru pe cont propriu
cu programare asincron.
Ca și în parte, dacă ați luat 161 și le-ați ocupat cu încuietori
și ridica condiții și toate din acest cod, asincron
și un mediu cum ar fi node.js este de fapt mult,
fără îndoială, mult mai simplu
decât de fapt scris cod multithreaded.
Ori de câte ori aveți cod multithreaded,
aveți condiții raise.
Trebuie să vă faceți griji cu privire la două fire care conțin
pentru aceleași resurse disc sau memorie.
Frumusețea JavaScript
în node.js este acolo literalmente un singur fir,
ceea ce înseamnă browser
sau serverul poate doar face un singur lucru de la o dată.
Este doar până la tine, programator
pentru a menține un model mental pentru cum fel de coadă lucruri
și dau seama cum la comanda codul.
Dar nu trebuie să vă faceți griji despre ridica condiții
în destul de același fel la cel cu codul Raw ca aceasta.
Deci, e un pic greu de grack aici.
Dar - Deci, lasă-mă să deschid docs pentru doar o clipă.
Biblioteca async.js care în mod similar este foarte googleable,
trăiește în Github repot ca o mulțime de ei.
Nu cred că e vag, nu este.
Lasă-mă să defilați în jos la Read Me aici.
Deci, biblioteca asincron oferă o grămadă
metodelor în interiorul vehiculului.
De exemplu, nu există o metoda numita fiecare,
care, dacă fac clic pe acest lucru doar pentru a vedea documentele sale pentru o clipă,
aceasta este o funcție sau metodă care vă permite să faci ceva
ca un patru fiecare dar în paralel.
Toate acestea sunt de gând să se întâmple potențial în paralel.
Și metoda de fiecare este doar de gând să se întoarcă la tine, atunci când toate
de iterații sunt complete.
Deci, poate că se întâmplă unul după altul.
În mod ideal, se întâmplă în esență, în paralel.
Dar metoda nu te sun înapoi.
Ea nu noutățile dvs. buzzer până când toate
dintre elementele pe care le au reiterată de peste s-au terminat.
Deci, e doar un mod frumos
de a evita utilizarea un simplu patru buclă
dar de fapt face ceva asincron.
Dar acum mai direct în legătură cu acest exemplu,
observa există acest Metoda serie.
Și permiteți-mi să trag o exemplu canonic simplu.
Deci, biblioteci asincron, seria Metoda ia în ca implicite
de parantezele pătrate din matrice.
Care sunt datele tipuri de elemente
în această matrice pe bază de pe un exemplu simplu?
Aceasta este o serie de funcții.
Deci, în C, v-ar suna ele funcționează indicii.
În JavaScript, există mai referire în mod corespunzător pentru funcțiile
sau funcții anonime.
Și acest lucru înseamnă doar, matrice
desigur, sunt ordonate de la zero, pe sus.
Deci, ei au menținut un ordin care este bun
pentru o serie, "seria cauza desigur mijloace de a face ceva
pentru a nu în paralel.
Deci, acest lucru înseamnă doar că această Funcția va fi executat,
atunci acesta, atunci această unul, acesta, atunci acesta,
cu toate acestea multe sunt
până când în cele din urmă opțional callback este numit.
Deci, observăm paradigma aici.
Și chiar dacă acest lucru este un tip de biblioteca,
este reprezentant al paradigmă foarte frecvente JavaScript
din nou, folosind callback.
Deci, observa ceea ce faci aici.
În prima funcție fiind a trecut în prin această matrice,
ați definit un anonim Funcția doar cu funcția.
Dar observați că se pare că în conformitate cu această documentație,
că funcția de anonim ar trebui să ia un apel invers argument.
Care va fi un pointer sau o referință la o funcție
care trebuie sa apelați când dvs. Codul este gata să se întoarcă o valoare.
Deci, din nou, spre deosebire de doar de programare de obicei procedural
în cazul în care v-ați obișnuit să Valorile se întoarce imediat
că o diferență de folosind o bibliotecă ca aceasta
în programare asincron mai mult în general, este atunci când sunteți gata
pentru a returna o valoare de o bază de date, dintr-un fișier,
dintr-o aritmetică expresie, este de până la tine
pentru a apela funcția de apel invers.
Și lucrul frumos despre această bibliotecă
dacă am citit docs mai multă atenție este faptul că,
dacă și numai dacă toate zona de callback numit
fără un obiect de eroare, va reuși totul?
Deci, cu alte cuvinte, dacă există 2,
în cazul în care există 10 anonime Funcții
în această matrice, prin urmare, în această serie,
numai dacă toate acestea reuși,
va apel invers opțional finală fi considerat de succes?
Dacă cineva dintre ei nu, fiecare funcție
după aceasta nu va chiar să fie executat.
Deci, acesta este un mod frumos de tip de a avea un lanț daisy
care intrerupe prematur în cazul în care ceva nu merge bine.
Deci, pentru a vedea acest lucru în context, aici este modul în care am putea re-pune în aplicare
că programul anterior.
I a lua calea ca mai înainte, astfel încât aceasta este partea cea mai usoara.
Am copy paste acest cod schelet
din documentația de acolo async.series paranteză deschisă,
deschide paranteză.
Și acum am observat o Funcția în acest început
de un al doilea, vom vedea unde mergem de la acest lucru.
Și acum observați, este un puțin complexe la prima
dar se concentreze doar asupra o linie cu linie.
Fs.stat înseamnă a obține statistici sau ceea ce nu de această cale.
Numesc acest apel invers atunci când este gata.
Acest cod este la fel ca mai înainte.
Dacă există o eroare, există o diferență acum.
Din nou, foarte frecvente paradigma în programare node.js este
în cazul în care ceva nu merge bine și un apel invers trebuie să știe
care prin convenție, primul argument pentru un apel invers se întâmplă
să fie nu, în cazul în care totul este bine sau un referire la un obiect de eroare,
de capital E. E ca o eroare clasa care exista la nivel global
dar mai mult pe care altă dată.
Deci, de a face acest lucru, în cazul în care există o eroare, ceea ce este implicarea?
Ei bine, bazat pe ceea ce am a declarat ca seria nu,
este în cazul în care ceva nu merge greșit, am doar un fel de doresc
pentru a abandona întreaga serie funcție de apelurile anonime.
Deci, este suficient pentru mine să doar reveni apel invers trecere
în obiectul de eroare.
Pentru că dacă stat a dat mă înapoi o eroare,
Am putea crea un nou Obiect de eroare de propria mea,
dar nu-mi pasă cu adevărat,
Vreau doar să treci indiferent eroare este că, de fapt se întâmplă
așa că am putea să-l dați la acest apel invers.
Și doar pentru a fi clar, întoarcere nu este strict necesar.
Vreau, în esență, să facă acest lucru dar am vrut acum te "întoarce;
/ /, Astfel încât nu mai cod aici execută ".
Deci, din nou, un alt comun convenție în JavaScript,
chiar dacă nu sunteți revenind o valoare în sine,
pe care doriți să treacă valoarea la funcția de apel invers
dar atunci ce vrei pentru a opri executarea
de funcția pe care esti la, modul trivial
pentru a face acest lucru este pur și simplu pentru a apela reveni aici.
Dar nu e nimic în neregulă,
noi doar facem apel invers retur eroare, chiar dacă se întâmplă
pentru a reveni în valoare nedefinită.
Bine, acest lucru nu returna o valoare, cel mai probabil.
Tot ce-mi pasă este o îmbarcare executarea ulterioară.
Deci, contopire mea de acestea două linii este doar un stilist
la convenție doar la au numărul de linii
de cod am scris la 2 la 1.
Deci, ce altceva?
Dacă nu există o eroare -
de fapt, să fie clar De asemenea, am putea evita
că de a face în cazul în care altcineva.
Dar, din nou, un alt paradigmă comun este de a verifica
pentru erorile până sus și apoi doar întoarce, mai degrabă decât să continue
a liniuță codul de elses și elses și elses.
Deci, dacă aceasta nu este o fișier, acum, stii,
Vreau să se ocupe de acest lucru un pic mai special.
Deci, aici ca și în Java sau C + + sau alte câteva limbi,
aici este cum poate instantia un obiect de tip eroare de trecere
într-un mesaj implicit a nu un fișier
și acest lucru este doar oarecum arbitrară.
Dar eu sunt de semnalizare o eroare de propria mea.
Și ce face această ultimă linie probabil semnifica?
Totul este bine.
Dacă treci în null pentru parametru de eroare, care tocmai înseamnă
prin convenție, totul este bine.
Deci, asta înseamnă că ceea ce se va întâmpla în mod logic?
Dacă este trecut nul de apel invers
înseamnă că acest anonim Funcția a reușit
ca să spunem așa.
Deci, ce ar trebui seria Metoda precede și acum se bazează
pe definiția mea verbal mai devreme?
[Inaudibil Observație]
Trece la următoarea, corect?
Dacă ar fi revenit un non-nul valoare, s-ar anula pur și simplu
și nu mai anonim Funcția ar obține numit.
Dar, pentru că ea nu are, atunci aceasta vor fi numit viitor.
Deci, logica de aici este cam la fel ca înainte
și vom vedea cum să curățați asta mai departe într-o clipă.
Îmi dau seama că este un fel de lot
pentru a absorbi toate verbal și vizual.
Dar acum observa, a doua Funcția anonim că vreau
pentru a executa în serie este să încercați să citiți fișierul.
Numesc acest apel invers atunci când sunteți gata.
Dacă există o eroare, doar semnal prin fel de apel invers
astfel încât restul chestiile astea eșuează.
Nul de întoarcere altceva.
Dar de ce sunt eu trecere în două argumente?
Ei bine, de data aceasta, dacă am citit fișierul și de a lua înapoi
ca o variabilă numită de date,
Vreau pentru a semnifica nu numai totul este bine, revenind null
pentru primul argument.
Vreau să se întoarcă real date ca al doilea argument.
Pentru că dacă am citit mai departe în documentația,
observa această ultimă bucată de cod paranteză înseamnă că este
capăt al seriei.
Au fost doar doi anonimi Funcțiile din această serie.
Dacă a existat o eroare aici, atunci Știu că unul dintre link-urile
în acest lanț atât de de a vorbi nu a reușit.
Cu alte cuvinte, această eroare va fi un obiect de eroare
că este nul în cazul în care orice dintre ei nu a reușit.
Și dacă acesta este cazul, eu sunt doar de gând să salveze și am de gând
să spun 400 care înseamnă cerere nu reușesc,
care este foarte generic mesaj de eroare.
Și apoi, am de gând să imprima mesajul de eroare.
Deci, eu nu deranjez pentru a fi super anal acest moment,
Eu nu am de gând să se facă distincția între 500 și 404 și 403,
Sunt doar un fel de val orbește mâna mea
și spune ceva a mers prost.
Dar, în cazul în care nimic nu a mers rău,
Am de gând să trimită această res.end trece aceste date.
Acum, acest lucru pare un pic criptic.
Dar, din nou, dacă am citit documentația,
al doilea argument pentru a acest apel invers finală, definitivă,
tipul care a executat numai odată ce seria se face
executarea sau o parte acolo a, aceasta va fi o matrice
de toate a doua argumente
care au fost transmise de apel invers.
Acum, se pare că legături numai în această serie
care întoarce de fapt la a doua argument este asta de aici.
Așa că am de gând pentru a sorta de la o salt de credință pur și simplu folosesc presupun
în momentul în care Ultima este o metodă de
care vă oferă ultimul elemente ale unui tablou.
Deoarece această matrice care este în curs de trecut
pentru mine are două indici, zero și unu.
E doar zero, nu are nici o valoare deoarece acest tip se întoarce -
nu trece într-o secundă argument, dar tipul ăsta nu.
Deci, rezultă suport zero este nimic,
Rezultatele suport unul conține ceea ce,
dacă ați fost în urma de-a lungul până la acest punct?
Fișierul, salut, conținut lume probabil,
asa ca asta e modul în care am de fapt, imprima.
Și lasă-mă să termin un detaliu aici.
Dacă aș face acest fel de vechi școală, dacă doriți să obțineți
la ultimele elemente, dacă am putea do rezultate [-results.length 1],
asta e un fel de mod vechi de școală
de accesare ultimele elemente in - sau index de matrice zero.
Dar, ca și în parte, amintesc că am avut această bibliotecă
aici subliniere care, prin convenție este sunat
literalmente o subliniere caracter care nu este special,
doar pare cool ca semn dolar face pentru jQuery.
Acesta este doar un ajutor Metoda de subliniere dot trecut
care face exact același lucru.
Și dacă nu ai folosit-o înainte de a sublinia JS atât
de codificare partea de client
și partea de server este o bibliotecă minunat util
care cât mai mulți oameni descrise place jQuery conține toate
metodelor, oamenii dorit a venit cu JavaScript în sine.
OK.
>> Deci, cum ar fi destul de la mine și M-am uitat în serie,
aveți ca de apel invers ca un argument?
>> Da.
>> La fel ca atunci când de fapt, cum ar fi apăsare în care,
si ca ceea ce-l face Adică, atunci când tocmai ai
cum ar fi de apel invers și apoi face ca -
[Inaudibil Observație]
>> OK, buna intrebare.
Deci, lasă-mă să trageți în sus Pagina principala asincron aici
sau documentația pe GetHub.
Deci, aceasta este canonice structura.
Dacă sunteți apel utilizând acest special serie metodă,
există două părți mari la acesta.
Una este o matrice de Funcții anonime
și doi este un apel invers finală funcție care este de fapt
executate la foarte capăt al seriei.
Acum, dacă vom mări într-o mai aproape pe primul
de aceste lucruri mari, gamă de funcții anonime
de cerință a acestui documentație tip are
să fie un anonim funcție care ia
într-un singur argument, numit de apel invers sau foo sau bar, nu contează
dar el o asteptare de apel invers.
Și aceasta este un fel de sonerie dvs. că Shake Shack vă mâinile.
Acesta este mijlocul prin care vă puteți întoarce o valoare
pentru client, deoarece poate nu doar literalmente se întoarcă.
Trebuie să o faci cu mod de acest apel invers.
Pentru că, dacă în interiorul acestui Funcția este ceva care rulează lent
cod cum ar fi baza de date de interogare, citit fișierul din sistemul de fișiere,
nu doriți să așteptați acolo și bloca oricine altcineva,
doriți să apelați apel invers.
Deci, aceasta este literalmente numele argumentului.
Dar, ca în C, vă au indicii funcții.
In Java aveți Metode de sistem de referință
și la fel aici în JavaScript.
Aceasta este o variabilă, dar tipul este funcția.
Deci, pur și simplu prin scrierea numelui său dacă un apel invers sau foo
sau bar, apoi paranteză deschisă și aproape paranteze,
esti de executare care pe această funcție.
Și trece printr-un nul care înseamnă eroare nul și unul
ceea ce înseamnă că aceasta este Datele pe care doresc să treacă inch
Și apoi bucată să fie clare, acest lucru este un alt apel invers.
Și nu se poate numi de apel invers,
doar conceptual este o Funcția metodă de apel invers
deoarece aceasta se numește prin definiție
bibliotecii acestui autor atunci când întreaga serie a finalizat
sau subset al acestuia în cazul în care un eroare sa întâmplat mai devreme.
Deci, numele de funcție de apel invers, de asteptare funcție de apel invers,
numele de funcție de apel invers, de asteptare funcție de apel invers,
diferit de apel invers funcționează toate împreună.
>> Avem acum ca defini apel invers?
>> Nu, pentru că acest tip va trece în matrice dvs.
Funcțiile de anonime,
un pointer la codul el vrea să se execute.
Exact, în regulă.
Deci, vă rugăm să spun că Codul devine un pic mai simplu.
Deci, se poate.
Si daca esti ca mine, ia confort în cel puțin cunoașterea,
este nevoie de un timp pentru a te obișnuiești cu acest lucru.
Dar putem curăța asta un pic,
nu arunce prea mult de la tine pentru a dar aici este o altă variantă
și ei folosind o altă metodă
în aceeași bibliotecă numit cascada.
Cu susul de care este spre deosebire de serie în cazul în care fiecare
din cei anonim Funcțiile executate în esență,
independent de fiecare din celelalte.
Waterfall ca numele sugerează permite funcțiile cele mai de sus
să treacă fel de valori la funcția de jos,
fel ca o cascadă de apă.
Deci, în sensul creșterii acestui este că eu pot fel
a folosi acest lucru in avantajul meu.
În async.waterfall, observă următoarele.
Eu pot apela doar fs.stat trece în calea
care doresc să se statistici cu privire la.
Și apoi amintiți-vă înainte de a a avut o funcție anonim
care a avut două argumente greșesc,
EZULTATE și apoi am sunat la funcție de apel invers manual?
Cu alte cuvinte este doar pentru a fi clar, reamintim că mai devreme
în asincron 2, am făcut tot de acest lucru urât.
L-am sunat trecut fs.stat în P,
a declarat propria mea anonim funcție.
Am verificat apoi dacă eroarea este nu null, atunci am făcut acest lucru,
altceva am făcut că, în ansamblu frumusețea în urma convențiilor
ca și în node.js este că de apel invers funcții în general, sunt destinate
să ia cel puțin un argument, un obiect de eroare urmat de zero,
sau valori mai utile.
Astfel observa paradigma aici,
această funcție de apel invers sunt declararea urmează exact
paradigmă că acest tip bibliotecă asincron nu.
Care este de a spune acest lucru, de ce sunt Am de punere în aplicare propria mea de apel invers
metodă când autorul acestui bibliotecă este literalmente mă predarea
pe un platou ca să spunem așa, o Funcția de apel invers pot folosi?
Deci, eu pot trece doar în de referință el mi-a dat
astfel încât imediat, mai multe linii mele
de cod deveni o linie de cod.
Acum, unde mergem cu asta?
Funcția următoare care Vreau să execute,
următor anonim Funcția în această matrice
funcțiilor face următoarele.
Preaviz primul stat este primul argument.
Așa ceva are a schimbat deja.
Acum, acest tip care a scris biblioteca -
și spun tip pentru că este un tip.
Acest tip care a scris această bibliotecă este garanții de documentare
că în cazul în care această funcție aici mi trece înapoi un obiect de eroare
sau urmată nul de o comă Lista separat de alte valori,
el va asigurați-vă că cei alte valori sunt pronunțate
pentru această funcție anonim în ordine, de la stânga la dreapta.
Și ceea ce folosit pentru a fi doar o funcție de apel invers singur pur și simplu
devine ultimul astfel de argument.
Acum, eu nu știu cine sunt concentrându-se pe doar știi.
Dar acum, ceea ce este ia de aici?
Deci, știm de la documentația
sau doi înainte de exemple
că fs.stat așteaptă în cele din urmă un apel invers, cu două argumente,
Eroare obiect care este o Obiect de eroare sau nul, urmată
cu o trimitere la statistici obiect.
Deci, dacă mă gândesc la asta, Obiect de eroare statistici coma obiect,
care se potrivește în paradigma bibliotecii acestei persoane.
Deci, pot să spun, pur și simplu pentru că Eu nici al doilea argument
că este - ce se intampla să fi trecut prin fs.stat
de apel invers este err, statistici prin definiție, din această bibliotecă,
Eu pot pune de-a doua Numele argumentul lui aici
sau tot ce se poate redenumi
dacă vreau urmat de apel invers aici.
Deci, eu pot trece unul valoare de aici aici.
Acum, toate de acest cod, deși desigur, oarecum criptic este
cel puțin copy paste pentru cea mai mare parte din înainte.
Singura diferență este preaviz aici am declara o eroare
obiect și acum vreau pentru a obține un pic crescator.
De fapt, vreau să știu ce eroarea a fost, așa că am de gând
la Tuck în interiorul acestui obiect o proprietate numita arbitrar cod
așa că știu că acest lucru nu este un fișier
că ar trebui să fie neautorizat, este un HTTP 403.
Permiteți-mi să amintesc că, înainte de Eu trec obiect de eroare
de apel invers.
Și apoi în cele din urmă încearcă să citească fișier, astfel încât în ​​acest caz,
cascada, mi-am rupt codul din doi pași mari
în trei pași mai mici.
Observați frumusețea aici,
Eu pot apela fs.readFile trecerea în calea.
Și apoi partea cea mai grea mental, este tocmai trece
în apel invers tipului.
Lucru pe care mi-predare, sunt O să treacă la fs.readFile.
Pentru că suntem toți aderare acelorași convenții,
Primul argument pentru un apel invers este un obiect de eroare sau nul, urmată
de o comă sau separat Lista de lucruri utile.
Deci, ceea ce înseamnă că, acum și dacă am citiți documentația voi ști
acest lucru, în ultimul apel invers, acest tip de aici în afara
din parantezele pătrate se întâmplă de a fi trecut în obiect de eroare
sau nul pe care eu ar trebui să verificați pentru ca întotdeauna cu acest cod de aici.
Și apoi, prin definiție, acestei metode
în documentația tipului, ultima valoare returnată
de la ultima metodă în matrice mea anonim -
matrice meu de funcții anonime.
Deci, ce se citesc retur fișier
și eu sunt, folosind o revenire vag acum.
Vreau să spun ceea ce nu citit pass fișier ca argumente
metodei de apel invers mana ei?
Două argumente, în primul rând este un obiect de eroare sau nul,
care este aproape întotdeauna va fi răspunsul.
Și al doilea lucru se întâmplă pentru a fi ceea ce pentru fișier citit?
Conținutul dosarului, date cum am numit mai devreme.
Deci, pur și simplu prin declararea err, ca rezultat,
și verificați dacă eroarea acest este un fel de plictisitor acum.
Altfel, eu fac res.end care trece în acest rezultat.
Acest lucru va fără îndoială, nu sincroniza perfect
până când de fapt scrie-l singur.
Dar de acum, să ia distanță cel puțin faptul
că există aparent aceasta paradigmă comună, prin care în cazul în care ne-am
și autori de biblioteci tot felul de băț
cu această convenție metodelor de apel invers.
Și primul argument este un obiect de eroare sau nul.
Și cea de a doua și a treia
și obiecte de al patrulea sunt lucruri ne pasa si am un fel
a urma regulile și documentație.
Am început cu cod care sincer este destul de urât.
Și chiar dacă cele mai recente exemplu este sincer un fel de greu
să-și încheie în jurul mintea ta, este cel puțin vizual,
se pare ca e mult mai strict.
Și odată ce te confortabil cu ea, e mult mai ușor
și este atât de mult mai puțin predispuse la bug-uri decât că exemplul anterior.
Deci, lasă-mă să demonstreze un ultim lucru aici.
Aceasta este versiunea trei.
Si - Nu, hai să plece aceasta unul singur.
Lasă-mă să merg într-un cuplu de alte ultimele lucruri ca teasere.
În regulă, deci pe server 2.
OK. În primul rând, orice întrebări, Știu că acest lucru este mult
dar ai vrut mai mult instrucțiuni, așa?
N-ai spus bine instrucțiuni necesar.
Da?
[Inaudibil Observație]
Corect, tu ești în esență, indulgent de sistem de operare
să dau seama cum să jongleze toate aceste bile, la o dată,
citirea dintr-un fișier, citirea de la o bază de date.
Și este acest server de activarea JavaScript- în sine, care este unic filetat.
Și, în esență, și, de fapt,
există o imagine Nu m-am aruncat în sus,
și nu este neapărat toate că edificator
dar poate că vom da ai un model mental.
JavaScript în sine și nod
în special, are acest așa numita bucla eveniment.
Prin care, vă puteți gândi de node.js, programul,
este literalmente ca o buclă infinită.
E doar o buclă sălbatic, de așteptare și de așteptare și de așteptare,
caută sarcini pentru a finaliza.
Și sarcina ar putea fi, du-te aduce ceva de la o bază de date
sau aici e o valoare din baze de date sau du-te acest fișier
de disc sau aici e un ceară de la un utilizator.
Orice fel de eveniment, la fel ca evenimentul browsere condus,
astfel încât serverul eveniment secundar condus.
Și oricare dintre aceste lucruri constituie evenimente.
Deci cineva în node.js, doar a scris o buclă infinită,
o buclă sălbatic mare, de așteptare de lucruri să se întâmple.
Și, ca lucrurile se intampla, ea sfârșește într-o coadă, nu?
Desigur, o bază de date s-ar putea returna o valoare.
Și un sistem de fișiere, de operare sistem ar putea returna o valoare
la aproximativ în același timp Dar nu e, probabil, va
să fie o comanda la ei.
Și node.js se va au, în esență, o coadă
ca o matrice mare sau un vector, unele structuri de date
că toate tampoane de aceste lucruri.
Deoarece se poate literalmente doar ocupa unul dintre ei la un moment dat.
Deci, atunci când, dezvoltatorul,
scris asincron JavaScript cod, folosind asincron
funcția, tu care să permită acest așa-numita bucla eveniment pentru a merge
de capusa următoare, nu?
Deci, atâta timp cât vă imediat reveni ca toate
dintre aceste metode asincrone face ca fișier de citire și de stat,
se întorc imediat deoarece apel invers în cele din urmă
se întoarce.
De îndată ce te vei întoarce,
asta înseamnă că altcineva poate te mi-a venit de pe stocul aici
sau care se poate obține apărut off în fața cozii aici.
Și așa, există în fapt serializarea
de tot ce se intampla,
chiar dacă toate aceste lucruri se poate întâmpla în paralel
pe un sistem multi-thread.
Dar în sine și node.js server au fost difuzate
ca un fir.
Și partea de jos, care este t tu nu neapărat max
din computerului Capacitatea este la fel de deosebit
dacă aveți o bază de 16 sau chiar și un calculator 2 core
si esti doar de funcționare un exemplu de nod.
Dar dacă ai din nou ia ceva de genul 161,
să evite un coșmar imens de dureri de cap atunci când vine vorba
de rasă condiții și încuietori și semafor
și scris cu adevărat cod multithreaded,
așa și dezavantaje upsides.
OK. Deci, înapoi la codul de aici, permiteți-mi propun să începem
pentru a simplifica lucrurile un pic.
Am văzut un server de un pic acum care arata ca acest lucru.
Deci, asta e, fără îndoială, destul de simplu.
Dar, la fel ca și în lume de PHP, există cadre
ca Laravel și nu există lucruri cum ar fi Rails și Django,
același lucru în lume node.js.
Și vom petrece mai mult timp pe acest miercuri
și în următorul proiect.
Dar dacă mă duc într-un server de 2 director,
observa câteva paradigme aici.
Deci asta este - nu merge să fie un exemplu echivalent
dar se folosește un cadru numit express.js,
care este open source gratuit software-ul ca Rails și Django,
ca Laravel, asta e doar în cele din urmă merge
să nu fii apreciat astăzi Pentru că am fost scris
astfel de exemple simple.
Dar încredere în noi.
Acest lucru va fi foarte repede deveni prietenul tău
deoarece va economisi aveți o mulțime de cod TDS.
Și o paradigmă comun pentru o cerere express.js este
pentru a avea o app.js sau server.js fișier care conține logica
de program sau de la cel puțin punctul de intrare.
Puteți avea mai multe fișiere.
Un modul subdirector nod care are bibliotecile
pe care le-ați descărcat ca asincron
și se exprimă în altele.
Și apoi package.json, package.json arata ca acest lucru,
și îl puteți crea manual sau instrumentele pe care le crea pentru tine
și este literalmente un fișier json
și partea interesantă este dependențele de aici.
La fel ca în Laravel, voi a avut ca director furnizor
și a trebuit să vă faceți griji despre pachete și de a face -
actualizarea de fapt cu Artisan sau comenzi similare,
bibliotecile te s-au instalat,
similar cu package.json aici și vă gestionați bibliotecile
și versiunile că îți pasă.
Deci, dacă am avea un package.json, Eu pot face pur și simplu NPM,
Pachetul nod Manger instala, se va arăta în mod automat
la acel fișier package.json.
Uită-te și vezi, nu am cea mai recentă versiune
de toate modulele furnizori
într-un nod de subliniere module director aici sau poate
în unele părinte sau director strămoș.
Și dacă nu, e O să le descărcați
și veți vedea o grămadă
de lucruri HTTP merge pe fire.
Deci, de exemplu, permiteți-mi să vă arată conținutul
de module nod doar să-și exprime.
Lasă-mă să merg mai departe și șterge îndrăzneală module de nod
așa că tot ce am acum este aceasta.
Și dacă eu nu instala NPM, veți a se vedea că-l va citi
acel fișier package.json și am văzut o ieșire similară
la acest lucru în lume Laravel.
Se descarcă un întreg grămadă de lucruri și care este
deoarece în mod expres, la rândul său depinde de o mulțime
de alte biblioteci popoare.
Deci, toate acestea sunt un fel de fiind descărcate recursiv.
Până acum, dacă am face în LS din nou,
există module mele nod directorul înapoi
și exprima ca înapoi.
Deci, este doar un mod de simplificarea de administrare a pachetelor.
Acum, dacă ne uităm la fișier app.js, acest lucru se întâmplă
să fie o revenire la mai devreme server-ul nostru
unde ne-am scuipat out "Bună ziua, lume".
Dar observați paradigmele aici,
în primul rând avem nevoie expres modul, atunci avem această linie
de cod care știți din documentația.
Vă literalmente trata ca Modulul variabilă ca funcție,
atât de deschis aproape paranteză paranteze înseamnă executa o.
Care va aparent a reveni ceva vom
în general, suna o aplicație.
Cum funcționează?
Nu prea știu.
Voi lasa pe altcineva, stii, în lume expres scrie asta.
Am de gând să stau acum pe umerii lui sau a ei, astfel ca
pentru a face cererea mea care rulează un pic mai simplu.
Aici, am de gând să asculte pe acel port special
care ar putea avea orice.
Și aici este codul care este poate mai amintește acum
de Laravel și routes.php.
Deci, acest lucru este cină simplu, eu sunt doar de gând pentru a specifica un traseu
de stele slash, deci totul va fi absorbit
prin acest handler cerere.
Paradigma de cerere handler este funcția sa anonim
cu un argument cerere
și un obiect răspuns la fel ca înainte.
Și res.send în mijloace exprese va trimite codul de urmat
de ce vrei să trimiteți.
Și, bineînțeles, puteți face ceva crescator
de fapt, trimiterea fișiere sau HTML
sau generate dinamic conținut.
Dar de acum, tot ce am făcut a fost scuipat salut, lume.
Dacă vom merge într-un server de trei, acest lucru este chiar crescator doar
să-ți arăt unele functii.
Și vă vom arăta o versiune chiar mai sexy
din această miercuri.
Dar, dacă ați auzit vreodată de Socket IO, poate,
așa cum cred Jonathan sau cineva a spus mai devreme,
unul dintre lucrurile nod este foarte cunoscut
este timpul său real, comportament, corect?
Gândiți-vă în PHP MySQL, dacă au fost de a implementa un server de chat
în PHP prin care două persoane ar putea deschide o fereastră de browser pentru a foo.com
și apoi începe irc fiecare parte, Alice într-o singură fereastră,
Bob în alta, astfel încât fiecare dintre ele vede său
sau mesajele ei în cealaltă fereastră.
Cum ai face acest lucru in PHP si MySQL?
Utilizarea sau neutilizarea Laravel fel de imaterial, puteți avea
cum ar fi un fișier index.php.
Și ai ajuns să aibă - în unele cazuri Trebuie sa scuipe
din formular, astfel încât nu există va fi un formular HTML
care, probabil, nu prezintă prin depunerea formă normală
dar Ajax probabil, corect?
Deci, o prezenta pe handler, așa tastați într-un câmp de text,
te-a lovit intra și apoi devine trimis la server prin intermediul Ajax.
Ce faci atunci face pe server?
Deci, ai index.php
sau ceva dot PHP care este primit în parametru HTTP
de la utilizator, Alice sau Bob mesaj instant, ce faci
cu aceasta, pentru a se propaga la Bob sau Alice, respectiv?
Vă spun literalmente au instrumentele cu care
pentru a face acest lucru în min dumneavoastră.
Deci, ca ceea ce ai face?
Ai un minut să punerea în aplicare a acestui program.
Da?
[Inaudibil Observație]
Perfect. Corect, așa ai o bază de date.
Noi știm un pic bit despre MySQL.
Deci, aveți un tabel care este de mesaje,
Poate eo ori ștampilă, un ID de utilizator,
corpul mesajului ea însăși a creat asta,
actualizate și că toate astea.
Deci, stocați într-o bază de date.
Și să presupunem Alice trimite Primul mesaj, cum se obține Bob
acest mesaj acum din baza de date?
>> Ar putea fi ceva Ajax răspuns că se întâmplă în mod constant
înapoi la baza de date top obține [inaudibil].
>> Exact.
Deci, Codul lui Bob, care e codul este la fel ca Alice este doar un fel
de o relație simetrică,
Browser-ul lui Bob are unele cod Ajax asta e, probabil, poate, la fiecare 30
secunde trăgând server de sincronizare prin Ajax,
există mesaje noi?
Există mesaje noi?
Fiecare 30 de secunde se va pentru a fi un fel de suboptimal
pentru că el trebuie să aștepte chiar
dacă Alice literalmente doar a trimis mesajul.
Deci, browser-ul lui Bob ar putea fiecare al doilea a lovit pe server.
Dar asta înseamnă lui Alice Browser-ul este lovit pe server
în fiecare secundă.
Ce despre Charlie [Ortografie asumat]
și David [asumat ortografie] și Edward [asumat ortografie]
și orice altă literă a alfabetului?
Care-i problema de această abordare?
O mulțime de hit-uri excesive -
Adică ești doar în mod eficient Dozare propriul vedere
sau DDOSing, distribuite Atac denial of service
pe site-ul propriu, prin care au toate
dintre acești utilizatori ruleze JavaScript cod care este doar ping
heck din server-ul dvs. chiar dacă numărul arbitrar,
80 la suta din timp nimeni nu a spus nimic
în camera de chat.
Dar esti doar de verificare pentru a vă asigura de astfel de.
Deci, PHP într-o mulțime de limbile nu sunt numai bune
de comunicații în timp real.
Pentru că în PHP rechemare există nici o memorie centrală, corect?
Ai obiecte de sesiune care creează iluzia
de stocare central, dar care este pe o bază per utilizator.
Nu aveți memorie la nivel mondial cum faci într-un Java Servlet
în familiar sau în alte cadru de lucrări de genul asta.
Node.js deși, tu nu trebuie memorie la nivel mondial pentru că aveți
un server și că "poate amintesc nimic vrea
despre toți utilizatorii.
Și s-ar putea încă au o bază de date.
Dar un lucru frumos despre node.js de asemenea este faptul că este mult mai bine
decât ceva de genul PHP și creând iluzia
de manipulare multiple lucruri de la o dată.
Și, de fapt, ca și în parte, se poate implementa servere de chat în PHP,
dar v-ar face de obicei ceva numit de votare lung
care nu ping server la fiecare secundă.
Ping la server, server nu răspunde la tine
de sus din 30 secunde, stă literalmente
într-o buclă de așteptare și de așteptare.
Și serverul verifica dacă există noi date în baza de date
și numai după ce te vede, "Oh, aici e un mesaj de la Bob, "
nu se răspunde la serverul HTP?
Astfel încât efectul în browser-ul dvs. este că icoana IE sau Mozilla
sau orice ține doar de filare timp de 30 secunde la un moment dat.
Dar partea buna este, tu nu faci avea 30 de cereri de conectare
în 30 de secunde, aveți unul.
Așa se numește de votare lung.
Dar chiar mai bine în web moderne browsere este ceva numit
WebSocket, care luați CS143,
puteți face în mod eficient un Conexiune TCP de la un client
cum ar fi un browser de pe un server și apoi atârnă pe ea
fără a utiliza aproape cât mai multe resurse
ca HTTP ar putea face în mod tradițional.
Și Socket IO este o bibliotecă node.js
care face mult mai ușor să face conexiunile socket
sau iluzii acolo la pentru browserele vechi
astfel încât să puteți pune în aplicare această funcționalitate în timp real a lui.
Deci, aici este un exemplu.
Chestia asta de sus devine o puțin mai complicat
dar este mai ales copy si paste din documentația socket.io lui.
Iată acum o mai handler cerere precis.
În cazul în care cererea unui utilizator slash, ceea ce fișier voi
să fie aparent servi la ei?
Index.html.
Și nu e ceva nou chestii aici curent
pe care să-ți arăt într-o clipă.
Dar acest lucru este doar un alt mod
de hapsân un fișier o puțin mai eficient
mult decât a face fs.readFile.
Este un pic mai inteligent în special pentru fișiere mari.
Poveste atât de scurt, aceste linii doar pentru a servi
un fișier numit index.html
care de acum își asume conține forma HTML prin care Alice
și Bob s-ar putea comunica.
În cele din urmă, io.sockets.on, astfel încât această vine de la această linie aici.
Deci, eu sunt doar citit documentație io.socket dă-mi
acces la o așa-numită WebSocket cu un browser,
între browser-ul și serverul.
Ascult pentru construcții conexiune eveniment care mijloacele
atunci când utilizatorul prima hit-uri server încercând
pentru a deschide acest sens, sunt O să numesc acest apel înapoi.
Și acum, am de gând pentru a face următoarele.
La fiecare cinci secunde, ceea ce am de gând să fac?
Am de gând să emită sau difuza dacă vă amintiți zero,
limbajul grafic ar că o blocuri de difuzare?
Deci, ai de gând să emită
sau declanșa un eveniment numit arbitrar de pe server.
Și se va conține un mesaj Ping
și data curentă.
Deci, acest lucru este un real server de chat că Alice
și Bob se poate folosi, dar e un fel de un server automat de chat
în cazul în care mesajele sunt ping doar un fel de sonar.
E doar data la ore, care sunt fiind trimis la fiecare cinci secunde.
Deci, dacă am alerga de fapt acest lucru - și asta e tot.
Pentru a fi clar aici, aviz acest lucru este pur și simplu de logare pe aici.
Deci, lasă-mă să rândul său, un ochii la asta.
Permiteți-mi să fac nod de app.js.
Lasă-mă să merg la browser-ul meu.
Reîncărcați pagina de start aici.
[Pauză]
Și lasă-mă să închid inspectorul.
La fiecare cinci secunde, am o demonstrație, chiar dacă nu
interactiv pentru om
de ceva care este întâmplă asincron.
În anunțul de browser-ul, nu exista nici o pictogramă de filare.
Se utilizează o funcție crescator de Chrome în browserele moderne
menținerii unei prize conexiune sub capota
și că este ceea ce se numește în general un model de pub / sub,
publica / abona model de, în cazul în care nu am făcut
că destul de explicit aici.
Dar ceea ce este frumos despre acest pub generale / sub paradigmă este
pe care le poate avea un editor.
În acest caz server central și toate
individului browsere sunt clientii.
Alices și Bobs ale lumea se pot abona la aceasta,
astfel încât să puteți releu mesaje printre orice număr de utilizatori.
Și chiar dacă suntem din nou Nu văd interactivitate,
am avut, poate, 12 de linii de cod doar pentru a face acest lucru.
Și, probabil, nu este un salt să ne imaginăm cum s-ar putea bici
din fișierul index.html care are o formă HTML adevărat,
pic de cod jQuery cu Ajax, care nu trimite un timp de zi
dar doar trimite orice Alice sau de tip Bob la server
și atunci serverul se va releu afară.
Și promit să privească la un ultim lucru doar
pentru a te tachineze cu asta.
Dacă vom merge în fluxul zero și unu,
veți vedea codul asta e doar un pic diferit aici.
Doar ca l-ai văzut, aceasta este o alternativă
a ceea ce am numit fs.readFile Metoda anterioară, prin care,
pot să vă spun node.js, "Du-te citi acest fișier în memorie.
Dar daca e mare doar da mi-o bucată, la un moment dat. "
Și s-ar putea ști de la CS165
sau 161 de sisteme de fișiere au diferite
proprietăți de performanță.
S-ar putea dori pentru a citi în blocuri de 512 octeți
sau 2 kilobytes sau orice altceva.
Aceasta este o modalitate de optimizare a obtinerea înapoi de fișier iterativ
astfel încât puteți să-l scuipe un pic mai repede
pentru browser-ul sau de a oricine clientul final este.
Cantitate atât de mare de conținut astăzi și vom arunca cu capul
în mai multe detalii miercuri cu Tim [asumat ortografie]
în special uita la modul în care ne-am poate traduce unele dintre ideile
din prima jumătate a Desigur Laravel și modele
într-o bibliotecă pe care el însuși a scris numit Bookshelf.js
care este devin din ce în ce popular în comunitate
pentru că vă oferă cea mai mare parte,
dacă nu mai mult decât funcționalitatea de elocvent
care amintesc este că înțelegere biblioteca de Laravel,
cu atât mai mult pe acest lucru și mai mult modul în care
să se dezvolte cu drepturi depline aplicații de pe miercuri.
Ne vedem atunci.