>> Greit.
Så cliffhanger var, hva er node.js som du kjenner det i dag?
Noe? Yeah?
>> Det var som en rammeverk skriver Java
applikasjoner i videre forstand -
>> OK, det fungerer.
>> - Jeg vet like vanligste bruksområdene som -
eller noe du kan gjøre er som -
[Hørbar Remark]
>> OK bra.
Ja, så det er et rammeverk.
Det er en motor der du kan kjøre Javascript-kode
server området.
Dette kan bety enkleste ting
som å skrive en kommandolinje script ikke i Python eller Bash
eller Ruby eller PHP, men bare i Java selv
og gjennomføre det på en blinkende ledetekst.
Eller du kan faktisk kjøre det innenfor en web server.
Og faktisk innenfor node.js seg selv,
denne rammen er en hel haug av bibliotekene blant dem er
i HTTP-server innebygd.
Så, kan du faktisk skrive en server som vi skal se
på bare et øyeblikk, super lett ved bare å forstå litt
av HTTP og TCP og porter.
Og du kan gyte en lyttende web server uten Apache,
uten Microsofts IIS.
Uten noen annen programvare installert,
du kan bare gyte dette og lytte til de fleste helst port
på systemet som du har lov til.
Så saken og poeng, la meg gå og åpne
opp dette eksempelet, server-0.js.
Så merker at toppen av denne filen, bare en haug
av uinteressante kommentarer, og så er det et par
av representative linjer med kode at vi får se recurringly.
Så får Div. HTTP krever "HTTP".
Så innebygd i node.js ' infrastruktur er en hel haug
av moduler som er egentlig bare biblioteker og alt er liksom
av navnerommet med den unike identifikator
som dette er "HTTP".
Så det som i en rekke språk som Java og C + +
og C, bare når du importere eller inkludere
eller i node snakke krever en modul gjør sine biter.
Og alt minnet krever få lastet
inn i RAM og derfor brukt.
Så, du liksom laste dette biblioteker eller moduler på forespørsel.
Dette betyr gå videre og kreve
for dette programmet HTTP-biblioteket,
og viser til at biblioteket ved i form av en variabel kalt HTTP.
Men dette venstre symbol kunne har blitt kalt noe, foo,
bar, baz, spiller det ingen rolle.
Så i motsetning til C + + og Java og C der når du trenger
eller importere et bibliotek, det bare en slags
av blir globalt tilgjengelig,
node.js moduler er mer tett navnerom.
Slik at egen - den funksjonaliteten kun er tilgjengelig i øyeblikket
ved hjelp av dette navnet variabel.
Du kan ikke bare begynne skrive metoder som eksisterer
i det høyre en måte som er sikkert er bra,
fordi da din namespace får ikke på langt nær så rotete
som i en rekke språk.
Ok, så nå som den vanligste foreslår, lage en HTTP-server
som Jonathan [antatt staving] var mulig er bokstavelig talt
så enkelt som å ringe lage server metoden inne
av HTTP-modul.
Så, er dette tilbake referansen
til noen form for web-server.
Det kom til Apache, ikke nødvendigvis så tung vekt.
Denne er litt enklere.
Og nå må jeg bare bare gjøre et par ting.
Så først, la meg bla ned til bunnen her
og hoppe behandleren metode for et øyeblikk.
Og legg merke til denne linjen med kode,
server.on som er hovedsak betyr server -
lytte som i jQuery kode,
lytte til et arrangement kalt forespørsel
og bare ta en gjetning hva skal jeg gjøre
når en forespørsel hendelse branner i serveren.
Yeah?
>> Ring funksjonen behandleren.
Så, bokstavelig talt kjøre kode som er referert
I denne variabelen og faktisk ikke en variabel til symbol her,
hva er det symbolet henviser til?
Vel, dette navnet fungere her oppe
og handler tilsynelatende tar to argumenter.
Hvorfor to? Vel, hvis du bare les ingen dokumentasjon
for denne modulen, du vil bli fortalt at behandleren
som startes vil bli gått minst to argumenter,
en referanse til forespørselen,
og innsiden av anmodningen vi bokstavelig talt bety HTTP-forespørsel.
Så, alle de HTTP-hoder som du kanskje husker
fra begynnelsen av semester eller noen tidligere klasse
eller erfaring som få linjen og vertslinjen
og User-Agent linje, alt dette er innkapslet og mer inne
av denne forespørsel objekt.
Og responsen objektet er sortert for utgående data.
Så, har du en referanse til en objekt som kommer til å tillate deg
å sende informasjon tilbake til nettleseren ved å ringe metoder
på at sistnevnte argument heter Res for respons.
Men dette kan bli kalt foo eller bar, dette er bare konvensjoner.
Så nå, hva gjør jeg?
Vel, ser det ut til at innsiden av denne super enkel web-server
at jeg gjennomføre, er jeg kommer til å gjøre følgende.
Jeg kommer til å skrive en HTTP header med statuskode 200,
200 mening OK, er alt vel.
Og så, jeg kommer å passere på tilsynelatende.
Hva er datatypen for andre argumentet til høyre hodet?
>> Det er et objekt?
>> Det er et objekt med hvor mange nøkler og verdier?
Bare en av hver, ikke sant, en sentral verdi av paret.
Så, 'innholdstype'.
Og den eneste grunnen Jeg siterer det her er
fordi bindestrek kan være smeltet sammen for et minustegn
eller noe sånt.
Så, må jeg sitere den her, singe eller doble anførselstegn.
Men igjen felles paradigme
i Javascript-koden er ofte apostrof i disse dager,
kolon, og deretter verdien.
Så, dette er bare den såkalte tankene type.
Dette er en HTTP-header det er bokstavelig talt kommer
å være tilfreds bindestrek typen kolon tekst slash vanlig som kommer
skal sendes fra serveren til nettleseren
slik at nettleseren vet om du vil kjøre dette som Raw tekst
eller HTML eller som en bilde eller en film
eller en flash-fil eller noe annet.
Nå, hvor skal jeg faktisk ønsker å sende i kroppen på siden?
Vel, bare ved å lese dokumentasjonen
for responsen objekt innsiden av dette biblioteket.
Jeg ser at det er en rettighet Fremgangsmåte og som tar en streng
kanskje andre ting, men minimalt en streng.
Og strengen er hva som er spytte ut til leseren.
I dette tilfellet sin super enkel, sin hello world,
men det kan være opne brakett, html, tett brakett,
åpen brakett hodet, tett brakett, og så videre,
dette kan være Raw html.
Men vi holder eksempelet enkelt ved bare å spytte
ut den enkleste av tankene typer som er uten tvil text / plain.
Og så Response.End bare betyr lukke tilkoblingen
og sende alt jeg har slags bufret inne
av dette objektet tilbake til nettleseren.
Jeg er ferdig. OK.
Så, er det siste Jeg gjør her nede
og dette er noe vilkårlig og ment å være kul,
er jeg forteller server endelig å lytte
på en bestemt TCP som standard port.
Husker fra begynnelsen av klasse som tjenester -
eller du vanligvis unikt identifisere det av tall,
AD er på nettet, 443 er HTTP basert nettsteder, er 22 SSH, er 21 FTP
og 1337 er bare vilkårlig men det er høyere enn 1024
noe som betyr at den mest systemer, kan jeg bruke det
uten super brukerrettigheter.
Så det er bare praktisk.
Men 8080 er i off - en felles en, 8088, virkelig noe stort
i de tusenvis som vanlig men dette er bare mer elite.
Greit, så hva som skjer når jeg faktisk kjøre dette?
Vel, jeg ikke bare gå siden i en nettleser.
Denne filen kalles server 0.js.
Fordi igjen, er Apache nå ute av bildet
for siste halvdel av kurset.
Hvis jeg ønsker å web server, trenger jeg å skrive
og deretter kjøre denne web server.
Men det viser seg at Java både på klientsiden
og tjenersiden et tolket språk.
Så, er alt jeg trenger tolk.
Så it '- hvis insisterer å kjøre node og deretter server-0.js,
Jeg kan eller ikke kan se noen utgang avhengig
på hva bibliotekene jeg har tatt, ingenting synes å skje.
Men la meg gå til en leseren og la meg gå
til den samme IP-adresse av mine CS50 klienter.
Men dette kan bare samt være min Mac
eller min PC og deretter trykk enter.
Som faktisk ser ut som Apache.
Det er som katalogen notering vi så
på i første omgang.
Så, hva har jeg gjort galt?
Yeah.
[Hørbar Remark]
Akkurat, ikke sant?
Så, er Apache fortsatt lytter på standard port 80.
Selv om jeg kunne endre det, Jeg kunne slå den av alle sammen
men det er fortsatt kjører.
Men disse gutta kan absolutt eksistere.
Jeg rett og slett nødt til å sette kolon 1337 og deretter kanskje
eller kanskje ikke en skråstrek på slutten for å få tilgang til denne porten
at denne serveren kjører på.
Og nå ser jeg at hallo, verden har kommet tilbake.
Og jeg kan treffe reload som mange ganger som jeg ønsker,
det er fortsatt tjene opp en side.
Faktisk hvis jeg åpner opp Chrome inspektør, gå til nettverket
og deretter laste hele siden,
legge merke til at dette var faktisk forespørselen som ble sendt.
Hvis jeg ser på Raw kilden,
merke til nettleseren min sender alle disse tingene.
Og så responsen fra serveren var super enkelt.
Det er 200.
Hvis det ikke er for lav på skjermen,
Det er innholdstypen.
Og så node.js slags automatisk
for meg lagt inn dato og alle de andre ting
at nettlesere vanligvis forventer.
Så, la oss bare se en lite tilregnelighet sjekk.
La meg gå tilbake til koden i server-0.js og la meg -
hver gang jeg går inn i føreren,
la meg bare si console.log.
("Vi hadde en besøkende! ').
Jeg trenger ikke å rekompilere eller noe sånt,
det er et tolket språk.
Så nå, la meg gå tilbake til siden, legg en, to,
tre ganger og gå tilbake til vinduet mitt.
Og nå ser jeg dette.
Vel det er merkelig, Jeg ser seks linjer.
Interessant web trivia, hvorfor gjorde Jeg får seks forespørsel ikke tre?
Yeah?
[Hørbar Remark]
Yeah. Så, som du kanskje kjenner Litt dumt ikonet øverst
av nettleseren bar at mye
av nettsteder som brukes makt være en Harvard kam,
det kan være en firmalogo eller noe sånt.
Så, nettlesere disse dager sorter
av presumptuously gjøre en ekstra HTTP-forespørsel
til nesten alle nettsteder som du besøker sjekker om det er
som standard en fil heter favicon.ico
i samme katalog som filen du ba om.
Og hvis så, setter det ikonet der.
Så alt vi ser er akkurat det.
Og faktisk, la oss se om vi kan se dette heller enn type
ut akkurat, "Vi hadde en besøkende '.
La meg gå videre og utgang.
Og jeg bare vet dette fra se på dokumentasjonen.
Det er en eiendom innsiden av anmodning objekt kalt URL
som skjer for å være veien
som ble forespurt i selve nettadressen.
Så, hvis jeg starter serveren ganske enkelt ved å omproduksjon node
på server-0.js og Nå gjør dette en, to,
tre og gå tilbake hit.
Det er det.
Slash er det jeg - den menneskelige ba om
i favicon.ico er hva leseren er
presumptuously ber om.
Men poenget er ikke så mye favicon stuff
men hvordan serveren er operert.
Yeah?
>> Hvorfor det har å være noen forespørsel?
>> Hvorfor har det å - av natur hvordan HTTP fungerer.
Så kan HTTP bare be én fil om gangen.
Nettlesere kan være smart i disse dager
og holde TCP tilkoblingen være åpen.
Hvis du tok CS143 eller generelt kjent med nettverksbygging,
slik at du kan få effektiviseringsgevinster
ved å holde nettverket socket åpen
i å gjøre flere HTTP forespørsler serielt enn det
men de er én fil per forespørsel.
Så, hvis du besøker noe sånt som -
Jeg mener vi kan gå til de fleste andre nettsider.
Hvis du går til - la oss trekke opp Chrome inspektør her.
Det kan få fylle de fleste på siden.
Gå til kategorien nettverk og gå til www.cnn.com.
Og når du besøker cnn.com, sin hjemmeside -
Nettleseren din heller atrociously gjør - fortsatt teller.
OK. Minst 289 HTTP forespørsler om og om igjen.
Og dette er grunnen til at når du besøker spesielt oppsvulmet nettsteder,
de er treg å laste på grunn av alle
av eiendelene de er lasting.
Så ser det ut som 298.
Det kan være noen Ajax skjer på dette punktet eller noen
av eiendelene er bare lavt.
Så, er en hver av disse individuell anmodning kommer tilbake
frem og tilbake, frem og tilbake.
Og det er derfor tidligere, selv selv om vi liksom snakket
om det noe fancifully hvor du setter skriptmerket,
absolutt gjør en forskjell når du har -
det begynner å ha mye av trafikk og mye
av filer som blir forespurt.
Og hver av dette representerer sannsynligvis et bilde, en mediefil,
en Javascript-fil, CSS-fil eller lignende.
Så er vi allerede opp til noen 4 megabyte bare
å se på dagens nyheter.
Godt spørsmål.
OK.
Så, hva er noen av oppsider skjønt?
Høyre, vet vi hvordan vi skal gjøre websider allerede med PHP.
Og mange av dere kom inn til klassen vite Django
og Python eller rails med Ruby.
Så, hvorfor trenger vi enda en språk og infrastruktur?
Hva er node.js spesielt god på hvis du vet?
[Pause]
Noen ting?
Nei? Yeah?
>> Videresending meldinger.
>> Så, videresending av meldinger.
Så det er sant, og det er sant for en mer teknisk årsak
og at node.js og virkelig Javascript er spesielt
godt egnet til asynkron kode,
hvis der du oppretter illusjonen
av å gjøre flere ting på en gang.
Så, selv om de er egentlig skjer serielt,
ja i de fleste tilfeller Java både klientsiden
og server side er enkelt gjenget.
Som hvis du tar 161 eller 61 betyr at -
av dette programmet vet,
tolken kan bokstavelig talt bare gjøre en ting på en gang.
Men dette er ikke bra for noe som en web-server
hvor du kan ha dusinvis eller hundrevis eller kanskje tusenvis
av brukere som prøver å få tilgang til websiden din
på samme tid.
Og likevel, som foreslår som håndterer dem en
etter den andre etter at andre spesielt hvis noen
av dem forespørsel som vi så på CNN kan kreve servering
opp 300 filer før du selv komme til neste bruker
som ønsker å se den, sier nyheten.
Node.js er bedre egnet for miljøer som det.
Fordi det som skjer er noe treg kjører prosessen
som å lese en fil fra disk eller spør en database eller snakke
til en annen nettverksserver,
som har en tendens til å ha ventetid, ikke sant?
Hvis du fikk ta 61 eller 161 spesielt alt dette slag
av perifere tjenester en tendens til å være mye tregere
enn å gjøre noe på innsiden av det samme RAM og samme CPU
som sier i dette tilfellet serveren er faktisk kjører.
Men det som er fint om node.js er at du kan -
og Java mer generelt er at du kan gjøre noe
og deretter si: "Hmm, dette kommer
å ta meg et par millisekunder eller til og med noen få sekunder.
La meg liksom punge det av, " men det er ikke en ekte prosess.
Og så når det er gjort gjør som sakte kjørende prosess
som griper rader fra en database eller lese en fil. html
fra disk, vil det komme tilbake til meg heller
enn meg å måtte vente på det.
Så, for å gjøre dette mer tydelig.
Dette er min måte gjøre dette mer kjent.
Greit, så dette er den Shake Shack på torget.
Dette er liksom en felles paradigme
for asynchronicity forklare.
Dette er faktisk en god eksempel fordi Shake Shack
og Tasty Burger er bemerkelsesverdig bremse for hva de gjør.
Men poenget er at de er virkelig flink til å ta bestillinger
og tar pengene dine etter som du venter på maten.
Så, er dette faktisk en bedre utforming enn alternativet.
Fordi anta at du går inn en butikk som dette, og du fikk
til forsiden av linjen, og du har lagt inn bestillingen, og du vil
til burger, så godt jeg kan fortelle, tar det minst fem
eller flere minutter å faktisk få en burger.
Så ville det være snill av en dårlig forretningsmodell
hvis mens du venter på din burger, Alice [antatt staving]
og Bob [antatt staving] og Charlie [antatt staving]
og alle andre er kø bak deg
og du er bokstavelig talt blokkerer linjen venter på maten.
Så åpenbart, på Shake Shack
og andre fast food steder ikke gjør dette,
de gjør noe som dette.
De gir deg en buzzer.
Og de liksom sende deg på vei.
Og de ringer deg tilbake etter gjør denne lille tingen vibrere
eller blits for å få din oppmerksomhet.
Så, er dette bokstavelig talt hva?
Noe som node.js gjør.
Hvis node.js eller Java Mer generelt blir brukt
og programmerer er smart nok
å realisere, "Vet du hva?
Uansett hva jeg trenger å gjøre det rette her kunne ta noen flere
av millisekunder eller sekunder.
Vet du hva?
La meg gå videre og ikke kaller det synkront -
"Som er fyren blokkering alle andre i linje, "-
la meg gå videre og slags tre til side
og bare ringe meg tilbake
når den lange løpe operasjonen er fullført. "
Og ringe tilbake selvfølgelig er noe som henviser i dette tilfellet
til en tilbakeringingsfunksjon, en referanse til en chuck med kode
som vil bli henrettet når burger er klar,
mye som denne tingen har noen slags funksjonalitet innebygget
at det begynner å vibrere eller summende når det er tid for deg
å bli kalt tilbake til forsiden av linjen.
Så, hva betyr dette bety i reelle termer?
Vel, vi må jobbe oss opp.
Så, la meg gå videre og gjøre dette først.
I server-1.js, la meg første forenkle koden
slik at vi kan ta små steg mot en mer overbevisende problem.
Dette er nøyaktig samme program som jeg skrev før.
Men hva som er endret?
Det er liksom en liten syntaktisk forskjell
mellom dette og versjon 0 for et øyeblikk siden.
Hva hopper ut på deg hvis du husker?
Yeah Cynthia [antatt staving]?
[Hørbar Remark]
Yeah. Så nå har vi en linje av funksjonen som blir gått i.
Vi har blitt kvitt den slags
av uselessly oppkalt handler funksjon.
Ubrukelig i denne før selv kaller det på ett sted,
Jeg vet egentlig ikke trenger å kaste bort tid på å gi den et navn
og gjør det vanskeligere å lese koden topp til bunn.
Så, la oss bare erklære inline er en anonym funksjon.
Og jeg gjør to andre ting.
Jeg gjør bedre bruk av dot notasjon.
Så som i jQuery, mye node metoder kan kjedes sammen.
Slik at når du er ferdig ringer noe, trenger du ikke
å vente til en ny linje og ringe en annen metode,
du kan bare kjede dem sammen.
Og så på denne måten, kan vi virkelig stramme opp dette.
Så, er dette bokstavelig talt en webserveren i fem linjer
kode total motsetning til -
i motsetning til hva du kanskje normalt må gjøre for å sette opp noe.
Hvis jeg går inn i serveren 2 nå, la oss gjøre dette.
I server 2 - faktisk la oss komme tilbake til denne serveren to.
La oss nå åpne opp async-0.js og løse det problemet for hånden.
Så først, la oss gå videre og åpne
opp async-0.js i nettleseren.
Så async-0, la meg gå tilbake til nettleseren.
Hit reload.
Og nå, er denne typen av feilmeldingen.
Faktisk jeg ser en 500 i Chrome inspektør.
Men la meg mer presist be hello.txt.
OK. Så, dette synes å fungere.
Så async-0.js ser ikke ut til tjene opp noe for skråstrek.
Det har ingen standard fil støtte.
Men hvis jeg eksplisitt be hello.txt,
som synes å være støtte.
Hvorfor er det?
Vel, hva jeg har gått her
og gjort er implementert en super enkel web-server
som viser hvor asynchronicity kan være nyttig.
Og det er implementert som følger.
Først, jeg bruker den HTTP-modulen igjen,
men også FS som trolig står for?
Generelt i CS, filsystem.
OK filsystem.
Dermed videre FS, filsystem.
Greit, så hva gir dette meg?
Funksjonalitet knyttet til filer som blir vedtatt,
åpne filer, skriver kataloger, leser kataloger
og alt av den slags ting.
Så nå legger merke til, denne koden er den samme som før,
opprette serveren, passerer i en anonym funksjon.
Dette er slags vilkårlig.
Dette er ikke en svært sikker web server.
Faktisk kan du få tilgang mest alle filer på harddisken min
eller på serverens hardt kjøring ved å utføre denne koden
fordi jeg er bare blindt forutsatt at jeg kommer
å gripe hva brukeren spurt i nettadressen.
Og jeg kommer til å prefiks den med prikk
slik at jeg er marginalt å være trygg
ved å si hva fil de kan forespørselen må i det minste start
i gjeldende katalog.
Selvfølgelig er det en trussel her.
For hvis de i stedet inkludere hva?
I deres vei, kan slags de av omgå det også.
Dot, prikk, ikke sant?
Så, hvis brukeren bare sette punktum, prikk i nettadressen, i teorien,
de kunne begynne å få min - og si passordfilen.
Så, dette er ikke ment å være sikret,
det er ment å være enkel.
Så her har jeg en variabel som er sammensetning av dot
som er til stede katalog og forespørselen URL
som vi så før er som slash eller / hello.txt.
Så nå blir det en litt mer interessant.
Først merke nederst.
Jeg lytter på samme port som før.
Så den virkelige interessant Arbeidet er inne på her.
Hver gang en forespørsel kommer inn ved naturen
av denne koden, hva gjør jeg?
Jeg ringer fil systemets lese filen metode,
bestått i banen at jeg ønsker å lese.
Og nå, er dette hva som er interessant her,
Dette er etter gjennomføringen i asynkron metode.
Du kan ikke få en avkastning verdi fra lese filen.
Faktisk varsel, er det ingen venstre uttrykk
til venstre for lese-fil.
Det betyr ikke returnere en verdi.
Snarere, kaller det en tilbakeringing fungere når den er klar
å gi deg tilbake et svar.
Så igjen for å være klar, mens det i gamle dager,
i mange programmerings språk, hvis du ønsket
å lese en fil sak i punkt PHP,
file strek få understreker innholdet,
du har en venstre uttrykk i alle verdien etter -
før likhetstegnet, det betyr at du tildeler
til at variabel avkastning Verdien av denne funksjonen.
Du kan gjøre det i node.js, men du vanligvis har
å ringe eksplisitt synkron versjoner av funksjoner liker,
Jeg tror det er lest sync fil eller synkronisering lese filen.
Jeg har glemt hvordan de heter det.
Og det ville gi du en returverdi.
Men hvis denne filen er på noen ekstern filsystem
eller disk er bare naturlig treg, det kunne ta 10 millisekunder
eller to sekunder for at filen å faktisk komme tilbake.
I mellomtiden, ingen annen web besøkende blir betjent
ved din websit.
Du blokkerer.
Det er det som kalles blokkerer IO, input / output.
Så her, dette er mye smartere.
Fordi hva node.js kommer
å gjøre ved å tolke er følgende,
det kommer til å ringe lese filen metoden,
prøv å en opp filen som har fått en bane som er angitt av verdien P.
Og så hvis og når den er klar å gi deg tilbake innholdet
av filen P, vil den ringe en funksjon som signatur er
etter konvensjonen følgende.
To argumenter, den første av som er kanskje en feil objekt,
stor E, er det et objekt kalt Feil eller Null
hvis det er ingen slike feil.
Og det andre argumentet - ta en gjetning - kommer til å være det?
Det kalles data åpenbart, men hva er data mer konkret?
>> Innhold?
>> Innholdet i hello.txt i eksempel I trukket
opp i nettleseren min for et øyeblikk siden.
Så med andre ord å lese filen og mange node.js funksjoner
som på ikke returnerer verdier.
De kaller tilbakering og pass
til disse tilbakeanrop hva ville har vært tradisjonelt
returnere verdien.
På oppsiden av denne tilnærmingen er
at du kan ringe lese filen en T0.
Tilbakeringingsfunksjonen makt ikke kalles en hake senere
så å si på T, det kan kalles en T1000,
tusen flått senere.
Men poenget er at Resten av koden i denne filen
hvis noen ville umiddelbart bli henrettet mens node.js
og mens filsystemet finner ut hvordan å lese
filen og få den tilbake til deg.
Så du lage dette -
så effektivt illusjonen
av parallellitet samtidig som tregere kjørende prosesser er ikke
blokkere viktige ting, den delen som vedlike brukere.
Så, hvordan skal vi håndtere dette?
Dette er en svært vanlig node.js paradigme.
Og det er veien bare for å forenkle dette er vi får se før sammen.
Jeg først sjekket om Feil er ikke null.
Så, hvis det ikke er falsk så var det en feil.
Jeg vet ikke hva det er, kanskje filen ikke eksisterer.
Jeg hadde ikke tillatelser.
Veinavn er galt.
En rekke ting kunne gå galt.
For nå, kommer jeg til å vilkårlig returnere 500
som er intern serverfeil.
Noe gikk galt.
Jeg vet egentlig ikke bryr seg å diagnostisere det.
Så, la oss bare si brukeren det er brutt.
Og så, jeg kommer å gjøre res.end,
og dette er kortform.
Husker at siste gang jeg gjorde res.write
og da jeg gjorde res.end.
Hvis du bare ønsker å sende en linje av utgangs,
du kan bare gjøre alt på en gang med res.end med et argument,
og som kommer til å sende hva feilmeldingen er
innsiden av dette objektet til nettleseren.
Det ble ganske lysbuer husker et øyeblikk siden.
Jeg har ingen anelse om hva dette mente ved første øyekast.
Men da jeg ba om en fil som ikke eksisterer -
oops, trenger vi å kjøre serveren igjen.
Da jeg ba om en fil som ikke eksisterte, EISDIR,
så noe om det er katalog,
hvis jeg gjør noen tilfeldige streng der,
tilsynelatende det betyr at filen ikke engang eksisterer.
Og det er fordi min kode er rett og slett si å skrive
ut uansett Raw Feilmelding er,
så ikke veldig brukervennlig men minst jeg håndterer det.
Else, hvis det ikke var en feiling hva gjør jeg?
Samme som før spytte ut en 200 OK, en vanlig -
text / plain sinn type og så spytte ut dataene.
Og det er derfor jeg får den Innholdet i hello.txt som bare
å bekrefte om jeg så på hello.txt,
det er bokstavelig talt bare hallo, verden.
Og hvis jeg endret dette Hei, verden, lagre filen,
kjør server, oppdater siden.
Nå får jeg den versjonen.
Så, jeg har egentlig bare reimplemented en web-server
som er eksistert i mange år, men ved hjelp av node.js.
Men vi kan gjøre dette enda mer renslig.
La meg åpne opp async-1.js.
Nå merker jeg legger en annen modul denne periode
tilsynelatende banen modulen.
Nå er dette en god mulighet til å se
på hva dokumentasjonen ser ut.
Node.js er dokumentasjon.
Som PHP tror jeg er faktisk ganske bra
og rett frem.
Hvis jeg går til node.js og Google og søk etter node.js banen,
hva du vil se regel er en direkte link til en nettadresse
at jeg satt opp her for et øyeblikk siden.
Så / api er den offisielle sted å gå for dokumentasjon.
Og hva du vil se på toppen
node offisielle dokumentasjon er alle de metoder og
eller egenskaper inne i denne modulen,
hvorav den ene kalles delta.
Og bli med er hjelperen funksjon som kommer til å tillate meg
å ikke bry seg med alle de positive.
Og det har den ekstra bonus som du ser
fra bryggene er det også normaliserer den resulterende banen.
Så, hvis brukeren eller du har prikker eller prikk prikker eller en kombinasjon
av slike forhold stier, blant oppsider
av det sammenføyde metoden er at det kommer til å rydde alt opp
og gi deg en kanonisk banen uten noen
av disse prikker eller dot prikker.
Så, det er en god ting i generelt for sikkerhet minst
hvis du sjekker den returnere verdien som jeg ikke
i dette enkle tilfellet.
Men jeg hadde lyst til å bruke den.
Så, jeg nå opprette banen en litt mer programma
med path.join stedet av Raw sammensetning.
Så, det er litt renere enn før.
Og nå merker jeg blir en litt mer intelligent heller
enn bare blindt prøver å lese filen,
Jeg skal faktisk ringe fs.stat.
Så, hvis du er kjent
med lavt nivå C funksjoner og C, selv PHP.
Mange bibliotek har denne funksjonen statistikk avkastning
hovedsak statistikk på en fil, filstørrelse,
tillatelsene, navnet og sånt,
og også implisitt hvis filen eksisterer eller ikke,
og hvis det er en fil eller katalog
eller symbolsk lenke eller noe annet.
Så nå legger merke til, er jeg ringer fs.stat.
Og så tilsynelatende i henhold til dokumentasjon,
Jeg skal komme tilbake i feil objekt
eller Null fulgt av en stats objekt.
Men la oss sjekke dette, node.js.fs.
Her er filen systemdokumentasjon.
La meg se etter statistikk.
Det er mye mer av funksjoner her.
Oops, at stat sync, fs.stat.
Så her er det asynkron stats (2).
Det er meningen hvis du husker fra hovedsider,
kapittel 2 av hovedsiden
det betyr at dette er bokstavelig talt bare en node implementering
av lav-nivå systemfunksjon stat.
Så får tilbakeringing to argumenter, feil og stat
hvor stat er en fs.stats objekt.
Så la oss se hva dette objektet er ment å se ut.
La oss klikke hyperkoblingen og jeg ser det.
Den statistikkene objektet inneholder tydeligvis noen helper metode,
er fil, katalogen er en haug med andre ting.
Det er den "er" fil som jeg bryr meg om i dette spesielle tilfellet.
Så her går jeg.
Hvis det var en feil, så la meg bare kausjon denne gangen
og anta.
Hvis det er en feil, det var sannsynligvis en 404-fil ikke funnet.
Det kan være noe annet
men jeg blir litt lat her bare for å fokusere
på de mer interessante detaljer.
Men for brukerens formål, er fil ikke funnet,
hvis det var noen feil angivelse av filen.
Ellers, la meg sjekke om filen er faktisk en selve filen.
Så hvis det ikke er en fil, finnes det.
Det er noe der, men det er nok en katalog
eller kanskje en symbolsk lenke
eller noe annet som er funky på filsystemet.
Uansett, brukeren bør ikke se det.
Så nå, jeg bare kommer til å spytte
ut konvensjonelt uautorisert 403.
Men igjen bare en konvensjon,
Jeg kunne ha brukt noe annet i teorien.
Og så til slutt, la meg prøver å lese filen.
Så, la meg bla nedover.
Og nå merker dette er der koden kan bli litt rotete,
legge merke til at jeg ringer fs.readFile bestått
i den samme bane, like tilbakeringing som forrige gang,
så den forrige versjonen.
Og så hvis jeg ville finne -
hvis jeg ikke finner det, Jeg spyttet ut av 500.
Og hvis jeg finner det, hva linjen skal vi se her?
Vi kommer til å se fs skrive header 200 trolig
og en res.end sending de faktiske dataene.
Men legg merke til dette.
Og dette er ikke demonstrative av worst case scenario.
Men jeg har denne stat-kall her enn jeg har noen ting.
Så, jeg har en annen asynkron samtale her,
så mer innrykk.
Så, bare slags ekstrapolere hvis du kunne fra her.
Hvilket problem har en tendens til å oppstå med språket som Java
i dette miljøet hvor du ikke har returverdier
men heller at du har disse tilbakeanrop.
Og selvfølgelig, dette er bare en stilistisk ting det faktum
at jeg holder innrykk.
Men ta dette til logisk neste skritt.
Anta at det var ett eller to eller tre andre funksjoner
at jeg trengte å utføre det var av naturen asynkron,
og derfor du bare slags holde innrykk til å håndtere dem,
til å håndtere dem, for å håndtere dem.
Du får liksom tilbakeringing helvete som folk kaller det
hvor koden starter å bli veldig stort
og ærlig veldig vanskelig å lese.
Som det er, kan jeg liksom knapt fortelle at dette er en slags flyt
som har denne typen
av stilistisk vinklet ting skjer her.
Så, er dette ikke ideelt fordi Dette kan veldig fort bli
uhåndterlig, selv om to asynkron kaller ikke
en så big deal.
Så, kan vi unngå dette, ikke sant?
Du kan ha fått et glimt at Jeg misclicked et øyeblikk siden.
I dokumentasjonen, vet du, det ser ut som det er statSync.
Og statSync tar ikke en tilbakeringing som et argument.
Det tar bare banen fordi det tilsynelatende gjør hva?
Den returnerer en forekomst av fs.stats.
Så dette kan være din første instinkt, ikke sant?
Spesielt hvis tilbakeringing funksjoner
og asynchronicity er en litt nytt for deg, ærlig,
den enkleste tilnærmingen er trolig bare unngå problemet alle
sammen, gå tilbake for å sortere av CS101 stil programmering
hvor du ringer funksjon eller Metoden returnerer verdien,
telefonfunksjonen, returnerer verdien,
funksjon, returnerer verdien.
Og jeg kunne bruke derfor fs.statSync
som er bokstavelig talt den samme men det er en synkron versjon
noe som betyr at den returnerer verdien.
Det går ikke en verdi til en tilbakeringing.
Men hvorfor skulle det trolig være en suboptimal løsning å ty
til synkrone funksjoner?
Yeah?
[Hørbar Remark]
Akkurat, det tar lang tid.
Du bare bremse alt ned.
Fordi mye som Shake Shack eller Tasty Burger, hvis de ble kvitt
av disse buzzerne og gjort deg, kunden stå på forsiden
av linjen før maten er klar før du selv tar rekkefølgen
på personen bak du åpenbart
gjennom put bremser ned.
Folk begynner å forlate, du liksom trekke pakker.
Du kan lage et ubegrenset antall av analogier her.
Men kort sagt, er det sannsynligvis ikke en god ting
i forretninger eller på serveren.
Så asynkron kode er vanligvis god minst
i dette tilfellet, men det definitivt begynner å forårsake noen angst.
Og faktisk tør jeg si når først å skrive slike ting,
det vil ta litt bit av å bli vant til.
Så, la oss begynne å utstyre du med noen biblioteker
og teknikker for å gjøre dette litt enklere.
Derfor, er en av de mest vanlige bibliotekene er populære biblioteker
disse dager, dette en som heter async.js.
Og som mange node.js biblioteker eller moduler,
disse er alle åpen kildekode.
De nesten alle bor og få hub repositories som er snill
av blitt de facto sted å lagre disse tingene.
Og så er det en Hele infrastrukturen
for å installere disse tingene kalles NPM, Node Package Manager
som hvis du er kjent med EvanTube er snill
av lignende app eller app får.
Hvis du er kjent med Red Hat og Fedora
som i apparatet, det er som yum.
Men det er en node - det er en pakkebehandler bare
for det spesielle miljøet.
Så, kan vi laste ned og installere ting som async bibliotek
og også en annen kalt strek bibliotek eller modul.
Men disse så langt fs, HTTP, bane,
de er alle kommet bygget i til node.
Så hvis vi går til API-docs, vil du faktisk se at bygget
til node du får gratis en hel haug av moduler.
Men mange fine mennesker på Internett har gjort dusinvis
om ikke hundrevis av andre bibliotek
å gjøre ting bedre eller på en annen måte.
Så, la oss ta en titt på hvordan dette biblioteket fungerer.
Så, de fleste av denne koden er identisk for øyeblikket.
Jeg har en bane å være laget opp toppen.
Og nå er jeg ringer async.series.
Så async bibliotek, er det bare et bibliotek som lar deg
å passere eller høyne vanligvis av funksjoner for å bli kalt en
etter den andre bare for å slags unngå at innrykk problemet,
og egentlig bare det mentale angst som vil alltid oppstå
i hvert fall når du først dykke inn i dette på egen hånd
med programmering asynkront.
Som i side, hvis du har tatt 161 og du har jobbet med låser
og heve forhold og alle av det, asynkron kode
og et miljø som node.js er faktisk mye,
mye enklere uten tvil
enn faktisk å skrive multithreaded kode.
Når som helst du har multithreaded kode,
du har bedre vilkårene.
Du trenger å bekymre deg to tråder som inneholder
for de samme ressursene disk eller minne.
Det fine med Javascript
i node.js er det bokstavelig talt bare én tråd,
noe som betyr at nettleseren
eller serveren kan bare gjøre en ting på en gang.
Det er bare opp til deg, programmereren
å holde en mental modell for hvordan du liksom kø ting
og finne ut hvordan å bestille din kode.
Men du aldri trenger å bekymre deg om bedre vilkårene
i helt samme måte på minst med Raw kode som dette.
Så, er det litt vanskelig å grack her.
Men - Så la meg åpne opp docs for bare et øyeblikk.
Den async.js bibliotek som Tilsvarende er svært googleable,
det bor i GitHub repot som mye av dem.
Tror ikke det er sketchy, er det ikke.
La meg bla nedover til Les meg her.
Så, async bibliotek gir en hel haug
av metoder innsiden av den.
For eksempel, det er en metode som kalles hver,
som hvis jeg klikker dette bare å se sine docs for et øyeblikk,
Dette er en funksjon eller en metode som gjør det mulig å gjøre noe
som en fire hver men i parallell.
De kommer alle til å skje potensielt parallelt.
Og fremgangsmåten er hver kun kommer til å gå tilbake til deg når alt
av gjentakelser er fullført.
Så kanskje de skjer den ene etter den andre.
Ideelt sett, de skjer hovedsak parallelt.
Men fremgangsmåten ikke gjør ringe deg tilbake.
Det spiller ingen buzz din summer til alle
av de elementene du har iterated over har gjennomført.
Så, det er bare en fin måte
for å unngå å bruke en enkel fire sløyfe
men faktisk gjør noe asynkront.
Men nå mer direkte i forbindelse med dette eksempelet
merker det er dette serie-metoden.
Og la meg bare trekke opp en enkel kanoniske eksempel.
Så asynkron biblioteker, serie Metoden tar inn som underforstått
av klammeparenteser i matrisen.
Hva er data typer av elementene
i denne matrisen basert på et enkelt eksempel?
Dette er en rekke funksjoner.
Så i C, vil du ringe dem fungere pekere.
I Javascript, er det mer riktig refererer til funksjoner
eller anonyme funksjoner.
Og dette betyr bare, arrays
selvfølgelig er bestilt fra null på opp.
Så, har de opprettholdt en ordre som er bra
for en serie, for serie selvfølgelig del gjøre noe
for ikke i parallell.
Så, dette betyr bare at dette Funksjonen vil bli henrettet,
så dette, da dette en, dette ene, så er dette en,
men mange det er
inntil endelig den valgfrie tilbakeringing kalles.
Så, merke paradigmet her.
Og selv om dette er en fyr bibliotek,
det er representativt for den svært vanlig Java paradigmet
av igjen ved hjelp av tilbakeanrop.
Så, legge merke til hva du gjør her.
I den første funksjon er gått inn via denne tabellen,
du definerte en anonym funksjonen bare med funksjon.
Men legg merke til at tilsynelatende henhold til denne dokumentasjonen,
som anonym funksjon bør ta et argument tilbakeringing.
Det kommer til å være en peker eller en referanse til en funksjon
at du bør ringe når Koden er klar til å returnere en verdi.
Så igjen, i motsetning til for bare typisk prosedyreorientert programmering
der du er vant til returnere verdier umiddelbart
at en forskjell å bruke et bibliotek som denne
i asynkron programmering mer generelt, er når du er klar
å returnere en verdi fra en database, fra en fil,
fra en aritmetisk uttrykk, er det opp til deg
å kalle tilbakeringingsfunksjonen.
Og det fine om dette biblioteket
hvis vi leser dokumenter mer nøye er det,
hvis og bare hvis alle den tilbakeanrop området kalt
uten en feil objekt, vil hele greia lykkes?
Så med andre ord, Hvis det er 2,
hvis det er 10 anonym funksjoner
i denne matrisen derfor i denne serien,
bare hvis alle av dem lykkes,
vil det endelige valgtilbakeringing anses vellykket?
Hvis noen av dem mislykkes, hver funksjon
etter det vil ikke selv bli henrettet.
Så, det er en fin måte å sortere av å ha en daisy chain
som avbryter tidlig hvis noe går galt.
Så for å se dette i sammenheng, her er hvordan vi kan re-implementere
det forrige programmet.
Jeg får den veien som før, så dette er den enkle delen.
Jeg kopierer lim dette skjelettet kode
fra dokumentasjonen der async.series åpen parentes,
åpne hakeparentes.
Og nå merker jeg har en funksjon i denne begynnelsen
av et sekund, vil vi se hvor vi går fra dette.
Og nå legger merke til, er det en litt komplisert ved første
men fokuserer bare på det linje for linje.
Fs.stat betyr få statistikken eller hva ikke av denne banen.
Kall dette tilbakeringing når du er klar.
Denne koden er den samme som før.
Hvis det er en feil, det er en forskjell nå.
Igjen, det svært vanlig paradigmet i node.js programmering er
hvis noe går galt og en tilbakeringing trenger å vite
at ved konvensjonen, den første argumentet til en tilbakeringing kommer
å være noe, dersom alt er vel eller en referere til en feil objekt,
kapital E. Det er som en feil klasse som finnes globalt
men mer om det en annen gang.
Så ved å gjøre dette, hvis det er en error, hva er konsekvensen?
Vel basert på hva jeg sa serien gjør,
er hvis noe går galt, vi bare slags ønsker
å avbryte hele serien av anonym funksjonskall.
Så, er det nok for meg å bare returnere tilbakeringing bestått
i feil objekt.
Fordi hvis stat ga meg tilbake en feil,
Jeg kunne lage en ny Feil gjenstand for min egen,
men jeg egentlig ikke bryr seg til,
Jeg ønsker bare å passere uansett feilen er at faktisk skje
slik at jeg kan gi det til denne tilbakeringing.
Og bare for å være klar, den Avkastningen er ikke strengt nødvendig.
Jeg egentlig ønsker å gjøre dette men jeg ville nå ikke "tilbake;
/ / Slik at ikke mer kode her utfører ".
Så igjen en annen vanlig konvensjonen i Javascript,
selv om du ikke er å returnere en verdi per se,
du ønsker å passere verdien å tilbakeringingsfunksjonen
men da du vil for å stoppe kjøringen
av funksjonen du er i, det trivielle måte
for å gjøre dette er bare å ringe tilbake hit.
Men det er ingenting galt,
vi bare gjør retur tilbakeringing feil selv om det kommer
for å gå tilbake i udefinert verdi.
Greit, gjør dette ikke returnere mest sannsynlig en verdi.
Alt jeg bryr meg om er en ombordstigning videre gjennomføring.
Så, min sammenblanding av disse to linjer er bare en stylist
til konvensjonen bare for å har antallet linje
kode jeg nettopp skrev 2-1.
Så hva annet?
Hvis det ikke er en feil -
faktisk å være klar Jeg kunne også unngå
at ved å gjøre om annet.
Men igjen, en annen felles paradigme er Kontroll
for dine feil opp toppen og deretter bare tilbake heller enn å fortsette
å rykke inn koden din med andens og andens og andens.
Så hvis det ikke er en fil, nå, vet du,
Jeg ønsker å håndtere dette en liten særskilt.
Så her som i Java eller C + + eller noen andre språk,
her er hvordan kan instantiate en objekt å skrive feilpasser
i en standardmelding av ikke en fil
og dette er bare noe vilkårlig.
Men jeg signaliserer en feil av min egen.
Og hva betyr dette siste linjen antagelig bety?
Alt er vel.
Hvis du passerer i null for feil parameter, som bare bety
etter konvensjonen alt er bra.
Så, betyr at det som vil skje logisk?
Hvis null er passert til tilbakeringing
det betyr at denne anonyme Funksjonen har lyktes
så å si.
Så, hva skal serien Metoden går forut for og nå har basert
på min verbal definisjon tidligere?
[Hørbar Remark]
Gå videre til den neste, ikke sant?
Hvis det hadde returnert en ikke-null verdi, ville det bare avbryte
og ikke mer anonym Funksjonen vil bli kalt.
Men fordi det har ikke, så dette vil bli kalt neste.
Så, er logikken her ganske mye det samme som før
og vi får se hvordan du rengjør dette opp videre i et øyeblikk.
Jeg skjønner at dette er en slags masse
å absorbere all verbalt og visuelt.
Men nå legger merke til, den andre anonym funksjon som jeg ønsker
å kjøre i serien er å prøve å lese filen.
Kall dette tilbakeringing når du er klar.
Hvis det er en feil, bare signalisere den ved hjelp av tilbakeringing
slik at resten av dette ting avbrytes.
Else avkastning null.
Men hvorfor er jeg passerer i to argumenter?
Vel denne gangen hvis jeg leser filen og komme tilbake
som en variabel kalt data,
Jeg vil ikke bare bety alt er bra ved å returnere null
for det første argumentet.
Jeg ønsker å returnere det faktiske data som det andre argumentet.
Fordi hvis jeg leser videre i dokumentasjonen,
legge merke til denne siste del av kode hakeparentes betyr at er det
slutten av serien.
Det var bare to anonyme Funksjonene i denne serien.
Hvis det var en feil her, så Jeg vet at en av linkene
i denne kjeden så å snakke mislyktes.
Så med andre ord, denne feilen kommer til å være en feil objekt
som er null dersom en hvilken som helst av disse gutta sviktet.
Og hvis det er tilfelle, er jeg bare kommer til å hoppe ut, og jeg kommer
si 400 som betyr forespørsel mislykkes,
det er veldig generisk feilmelding.
Og så kommer jeg til å skrive ut feilmeldingen.
Så, jeg er ikke plaget å være super anal denne gangen,
Jeg kommer ikke til å skille mellom 500 og 404 og 403,
Jeg er bare litt blindt vinke hånden min
og si noe gikk galt.
Men hvis ingenting gikk galt,
Jeg kommer til å sende denne res.end passerer disse dataene.
Nå dette ser litt kryptisk.
Men igjen hvis jeg leser dokumentasjonen,
det andre argumentet til denne siste, endelige tilbakeringing,
fyren som bare henrettet Når serien er ferdig
utføring eller en del der av, dette kommer til å være en matrise
av alle de andre argumenter
som ble vedtatt til tilbakeringing.
Nå viser det seg at bare koble i denne serien
som faktisk går tilbake til andre argument er dette en her.
Så jeg kommer til å sortere av på en porsjon tro bare bruke anta
for øyeblikket at siste er en metode
som gir deg det siste elementene i en matrise.
Fordi denne matrisen som blir vedtatt
for meg har to indekser, null og en.
Det er bare null har ingen verdi fordi denne fyren tilbake -
går ikke på et sekund argument, men denne fyren gjør.
Så resulterer brakett null er ingenting,
resultater beslaget et inneholder hva,
hvis du har fulgt sammen opp til dette punktet?
Filen, hallo, verdens innhold formodentlig,
så det er hvordan jeg faktisk skrive det ut.
Og la meg avslutte en detalj her.
Hvis jeg gjør dette slags gammel skole, hvis jeg ønsker å få
på de siste elementene, hvis jeg kunne do resultater [results.length-1],
det er liksom den gamle skolen måte
av tilgang de siste elementene i - eller null index array.
Men som i siden, husker at jeg hadde dette biblioteket
opp her strek som etter Konvensjonen er bare kalt
bokstavelig talt en understrek karakter som ikke er spesielt,
det bare ser kult ut dollartegn gjør for jQuery.
Dette er bare en hjelper metode underst dot siste
som gjør akkurat det samme.
Og hvis du aldri har brukt det før underst JS både
for klientsiden koding
og server side er en fantastisk nyttig bibliotek
at så mange mennesker som er beskrevet det liker jQuery inneholder alle
av metodene, mennesker ønsket kom med Javascript selv.
OK.
>> Så, som stort for meg og Jeg kikket inn i serien,
du har som tilbakeringing som et argument?
>> Ja.
>> Som så når du faktisk liker push som i,
og liker hva gjør det mener når du bare har
som tilbakeringing og deretter gjøre som -
[Hørbar Remark]
>> OK, godt spørsmål.
Så, la meg dra opp async hovedsiden her
eller dokumentasjon på GetHub.
Så dette er den kanoniske struktur.
Hvis du samtale med denne bestemt metode serien,
det er to store deler til den.
Den ene er en rekke anonyme funksjoner
og to er en endelig tilbakeringing funksjon som faktisk er
utføres ved meget slutten av serien.
Nå, hvis vi zoome inn et litt nærmere på den første
av de store tingene, den rekke anonyme funksjoner
ved krav om dette fyren dokumentasjon har
å være en anonym funksjon som tar
i ett argument kalles tilbakeringing eller foo eller bar, spiller det ingen rolle
men han kaller det tilbakeringing.
Og dette er liksom din buzzer at Shake Shack hender deg.
Dette er et middel som du kan returnere en verdi
til kunden fordi du kan ikke bare gjøre bokstavelig talt tilbake.
Du må gjøre det ved å måte av denne tilbakeringing.
Fordi hvis innsiden av dette Funksjonen er litt treg kjører
kode som spørring database, lese filen fra filsystemet,
om du ikke ønsker å vente der og blokkere alle andre,
du ønsker å ringe tilbakeringing.
Så, er dette bokstavelig talt navnet på argumentet.
Men liker i C, du har funksjonspekere.
I Java har du referansesystemer metoder
og det samme her i Javascript.
Dette er en variabel, men sin type er funksjon.
Så bare ved å skrive navnet sitt om en tilbakeringing eller foo
eller bar, deretter åpen parentes og sluttparentes,
du utfører som på den funksjonen.
Og passerer et null som betyr null feil og en
noe som betyr at dette er data som jeg ønsker å passere i.
Og så blings å være klar, dette er en annen tilbakeringing.
Og det er ikke kalt tilbakeringing,
det bare konseptuelt er en tilbakeringing metode funksjon
fordi det kalles per definisjon
av denne forfatterens biblioteket når hele serien er ferdig
eller et delsett av disse hvis en feil har skjedd før.
Så, navnet på tilbakeringingsfunksjonen, kaller tilbakering funksjon,
navngi over tilbakeringingsfunksjon, kaller tilbakering funksjon,
annerledes tilbakeringing fungere alle sammen.
>> Vi har nå like definere tilbakeringing?
>> Nei, fordi denne fyren vil passere inn din matrise
anonyme funksjoner,
en peker til koden han ønsker å utføre.
Akkurat, ja.
Så kan du si at Koden blir litt enklere.
Så, det kan.
Og hvis du er som meg, ta komfort i det minste vite,
det tar en stund å bli vant til dette.
Men vi kan rydde dette opp litt,
ikke å kaste for mye på deg men her er en annen variant
og dens bruker en annen metode
i det samme bibliotek kalt fossen.
På oppsiden av noe som er i motsetning til serien hvor hver
av de anonyme funksjoner utføres i hovedsak
uavhengig av hver av de andre.
Waterfall som navnet antyder gjør de øverste funksjoner
å slags passere i verdier til den nedre funksjon
liksom som en kaskade av vann.
Så oppsiden av dette er at jeg kan slags
av bruke dette til min fordel.
I async.waterfall, legge merke til følgende.
Jeg kan bare ringe fs.stat bestått i banen
at jeg ønsker å få statistikk på.
Og så husker før jeg hadde en anonym funksjon
som hadde to argumenter feile,
esults og da jeg ringte tilbakeringingsfunksjonen manuelt?
Med andre ord er bare for å være klart, husker at tidligere
i async 2, gjorde jeg alt av denne ekle arbeid.
Jeg ringte fs.stat vedtatt i P,
erklærte min egen anonymt funksjon.
Jeg så sjekket om feilen er ikke null da jeg gjorde dette,
annet jeg gjorde det, hele skjønnhet følgende konvensjoner
som i node.js er at tilbakeringing funksjoner generelt er ment
å ta minst ett argument, en feil objekt etterfulgt av null
eller mer nyttig verdier.
Så oppdager paradigmet her,
denne tilbakeringingsfunksjonen er jeg erklære følger nøyaktig
paradigme som denne fyren async biblioteket gjør.
Som er å si dette, hvorfor er Jeg implementere min egen tilbakeringing
metode når forfatteren av dette Biblioteket er bokstavelig talt levere meg
på en tallerken så å si, en tilbakeringingsfunksjonen jeg kan bruke?
Så kan jeg bare passere i referere han har gitt meg
slik at umiddelbart, min flere linjer
av koden blir en kodelinje.
Nå, hvor går vi med dette?
Den neste funksjonen som Jeg ønsker å utføre,
neste anonymt funksjon i denne matrisen
av funksjoner gjør følgende.
Innkalling første stat er det første argumentet.
Så noe har forandret allerede.
Nå, denne fyren som skrev biblioteket -
og jeg sier fyr fordi det er en fyr.
Denne fyren som skrev dette biblioteket er dokumentasjons garantier
at dersom denne funksjonen her passerer meg tilbake en feil objekt
eller null etterfulgt av koma separert liste med andre verdier,
han vil sørge for at de andre verdier er overlevert
til denne anonyme funksjon i rekkefølge fra venstre til høyre.
Og det som pleide å være bare en tilbakeringingsfunksjonen alene rett og slett
blir den siste slike argument.
Nå, jeg vet ikke hvem jeg er fokusere på bare du vet.
Men nå, hva er ta bort her?
Så, vi vet fra dokumentasjonen
eller forutgående par eksempler
at fs.stat slutt forventer en tilbakeringing med to argumenter,
Feil objekt som er en Feil objekt eller null fulgt
ved en referanse til objekt statistikkene.
Så hvis jeg tenker på det, Feil objekt koma statistikker objekt,
som passer i paradigmet av denne personens bibliotek.
Så kan jeg bare si fordi I Ingen andre argumentet
at det er - som kommer å bli vedtatt av fs.stat
til tilbakeringing er err, statistikk per definisjon av dette biblioteket,
Jeg kan sette den andre argumentet navn her
eller hva jeg kan gi den nytt navn
hvis jeg vil følges ved tilbakeringing her.
Så kan jeg passere en verds herfra til her.
Nå, alle av denne koden skjønt riktignok noe kryptisk er
minst kopiere lime for det meste fra før.
Den eneste forskjellen er varsel her jeg erklære en feil
objekt og nå vil jeg å få en litt mer avansert.
Jeg faktisk ønsker å vite hva feilen ble, så jeg kommer
å brette innsiden av dette objektet en Eiendommen vilkårlig kalt kode
slik at jeg vet at Dette er ikke et fil
som bør være uautorisert, det er en HTTP 403.
La meg huske at før Jeg passerer Feil objekt
til tilbakeringing.
Og så til slutt prøve å lese filen, slik at i dette tilfellet
fossen, har jeg brutt koden fra to store skritt
inn i tre mindre trinn.
Legg merke til skjønnheten her,
Jeg kan ringe fs.readFile bestått i banen.
Og så den vanskelige delen mentalt, er jeg bare passere
i fyren tilbakeringing.
Saken han levere meg, jeg er kommer til å passere til fs.readFile.
Fordi vi alle å følge til de samme konvensjonene,
første argumentet til en tilbakeringing er en feil objekt eller null fulgt
av en koma eller separert liste over nyttige ting.
Så, hva det betyr nå, og hvis jeg Les dokumentasjonen jeg vet
dette, den aller siste tilbakeringing, denne fyren her utenfor
av hakeparentesene kommer å bli vedtatt i feil objekt
eller null som jeg bør se etter som alltid med denne koden her.
Og da per definisjon av denne fremgangsmåte
i fyren dokumentasjon, den siste verdien som returneres
fra den siste metoden i min anonyme matrise -
min rekke anonyme funksjoner.
Så, hva betyr lese filen retur
og jeg bruker en avkastning løst nå.
Jeg mener, hva leser file pass som argumenter
til tilbakeringing metoden sin hendt?
To argumenter, er første en feil objekt eller null,
det er nesten alltid kommer til å være svaret.
Og andre ting kommer å være det for lese-fil?
Innholdet av filen, data som vi kalte det tidligere.
Så, ved ganske enkelt å erklære err, resultat,
og se etter feil dette er liksom kjedelig nå.
Else, jeg gjør res.end passerer i dette resultatet.
Dette vil utvilsomt ikke synkronisere i perfekt
før du faktisk skrive det selv.
Men for nå, ta bort i det minste det faktum
at det er tilsynelatende dette felles paradigme, der hvis vi
og forfatterne av bibliotekene all slags pinne
med denne konvensjonen av tilbakeringing metoder.
Og det første argumentet er en feil objekt eller null.
Og den andre og tredje
og fjerde gjenstander er ting vi bryr oss om, og vi sorterer
av å følge regler og dokumentasjon.
Vi startet med kode som ærlig er ganske stygg.
Og selv om den siste eksempel er ærlig slags vanskelig
å vikle tankene dine rundt, det er minst visuelt,
ser ut som det er mye strammere.
Og når du blir komfortabel med det, det er så mye enklere
og det er så mye mindre utsatt for å bugs enn det forrige eksemplet.
Så, la meg demonstrere en siste ting her.
Dette er versjon tre.
Og - Nei, la oss forlate dette alene.
La meg gå inn i et par av andre siste ting som teasere.
Greit, så i server 2.
OK. Først noen spørsmål, Jeg vet dette er en mye
men du ville ha mer instruksjoner, så?
Du sa ikke bra instruksjon nødvendigvis.
Yeah?
[Hørbar Remark]
Riktig, er du i hovedsak mild til operativsystem
å finne ut hvordan å sjonglere alle disse baller på en gang,
lesing fra en fil, lese fra en database.
Og det er dette Java serveren seg selv som er singel gjenget.
Og egentlig og faktisk,
det er ett bilde Jeg kastet ikke opp,
og det er ikke nødvendigvis alt som opplysende
men kanskje vi skal gi du en mental modell.
Java selv og node
Spesielt har dette såkalte event loop.
Der, kan du tror av node.js, programmet
er bokstavelig talt som en uendelig løkke.
Det er bare en vill loop, venter og venter og venter,
på jakt etter oppgaver å fullføre.
Og oppgaven kan være, gå hente noe fra en database
eller her er en verdi fra database eller går du få denne filen
fra disk eller her er en be om fra en bruker.
Enhver form for arrangement, akkurat som den nettlesere event drevet,
slik som serveren side event drevet.
Og noen av disse tingene utgjør hendelser.
Så noen i node.js, bare skrev en uendelig løkke,
en stor vill loop, venter for ting å skje.
Og som ting skjer, det ender opp i en kø, ikke sant?
Riktignok en database kan returnere en verdi.
Og et filsystem, drifts Systemet kan returnere en verdi
på omtrent samme tid men det er trolig kommer
å være noen bestilling til dem.
Og node.js kommer til å har egentlig en kø
som en stor matrise eller en vektor, noen datastruktur
som buffere alle av disse tingene.
Fordi det kan bokstavelig talt bare behandle en av dem på en gang.
Så, når du, utvikleren,
skriver asynkron Java koden ved hjelp av asynkron
funksjon, du tillater dette så-kalt arrangement sløyfe for å gå
til neste kryss, ikke sant?
Så lenge du umiddelbart returnere som alle
av disse asynkrone metoder liker lese filen og stat,
de returnerer umiddelbart fordi tilbakeringing til slutt
kommer tilbake.
Så snart du kommer tilbake,
det betyr at noen andre kan blir skutt av aksjen her
eller at det kan bli spratt frem foran i køen her.
Og så er det i Faktisk serialisering
av alt som skjer,
selv om alle disse tingene kan skje parallelt
på en flertrådet system.
Men node.js seg selv og serveren kjørte
som en tråd.
Og ned siden av som er t du ikke nødvendigvis maks
ut din datamaskins evne er så spesielt
hvis du har en 16 kjerne eller enda en to kjerne datamaskin
og du bare kjører en forekomst av node.
Men hvis du har igjen tatt noe sånt som 161,
du unngår et stort mareritt av hodepine når det gjelder
å rase forhold og låser og semafor
og skrive virkelig multithreaded kode,
så oppsider og ulemper.
OK. Så tilbake til den kode, La meg foreslå at vi starter
å forenkle ting litt.
Vi så tjener man litt siden som så ut som dette.
Så, det er uten tvil ganske enkel.
Men akkurat som i verden av PHP, er det rammer
som Laravel og det er ting som Rails og Django,
samme i node.js verden.
Og vi vil bruke mer tid på dette på onsdag
og i neste prosjekt.
Men hvis jeg går inn i en server 2 katalogen,
merke til et par paradigmer her.
Så dette er - det går å være en ekvivalent eksempel
men den bruker en rammeverk kalt express.js,
som er gratis åpen kildekode programvare som Rails og Django,
som Laravel, er at bare slutt kommer
å være lite verdsatt i dag Fordi vi har vært å skrive
slike enkle eksempler.
Men stol på oss.
Dette vil veldig raskt bli din venn
fordi det vil spare deg mye TDS-kode.
Og en felles paradigme for en express.js søknad er
å ha en app.js eller server.js fil som inneholder logikk
av programmet eller ved minst inngangspunkt.
Du kan ha flere filer.
En node modul underkatalog som har bibliotekene
at du har lastet ned som async
og uttrykke seg selv i andre.
Og så package.json, package.json ser slik ut,
og du kan lage det manuelt eller verktøy lage det for deg
og det er bokstavelig talt en JSON fil
og den interessante delen er avhengigheter her.
Akkurat som i Laravel, du hadde denne leverandøren katalogen
og du måtte bekymre om pakker og gjør -
faktisk oppdaterer med Artisan eller lignende kommandoer,
bibliotekene deg har installert,
på samme måte med package.json her og du klarer bibliotekene
og versjoner at du bryr deg om.
Så, hvis jeg har en package.json, Jeg kan rett og slett gjøre NPM,
Node Package Manger installere, det kommer til å se automatisk
på at package.json fil.
Se og se, det gjør jeg har den nyeste versjonen
av alle leverandørene moduler
i en node underst moduler katalogen her eller kanskje
i noen av foreldrene eller stamfar katalog.
Og hvis ikke, er det kommer til å laste dem
og du vil se en hel haug
av HTTP ting som skjer på tvers av wiren.
Så for eksempel, la meg vise deg innholdet
av node-moduler bare for å uttrykke.
La meg gå videre og frimodig slette node moduler
slik at alt jeg har nå er dette.
Og hvis jeg NPM installere, vil du se at det kommer til å lese
at package.json fil og vi har sett utdata som likner
til dette i Laravel verden.
Det er å laste ned en hel haug med ting, og det er
fordi express i sin tur avhenger av en hel haug
av andres biblioteker.
Så, alle av disse er liksom lastes ned rekursivt.
Inntil nå, hvis jeg gjør i LS igjen,
det er mine node moduler katalogen tilbake
og uttrykke som back.
Så det er bare en måte å forenkle pakkehåndtering.
Nå, hvis vi ser på app.js fil, dette kommer
å være en tilbakevending til vår tidligste webserver
hvor vi bare spytte ut "Hello, World".
Men legg merke til de paradigmer her,
første krever vi uttrykkelig modul, så har vi denne linjen
med kode som du vet fra dokumentasjonen.
Du bokstavelig behandle som modulens variabel som en funksjon,
så åpen parentes nær parentes betyr utføre den.
Det kommer til å tilsynelatende returnere noe vi skal
vanligvis kaller en app.
Hvordan fungerer det?
Jeg vet egentlig ikke.
Jeg skal la noen andre, vet du, i den uttrykkelige verden skrive det.
Jeg skal nå stå på hans eller hennes skuldre, slik som
for å gjøre min søknad kjører litt enklere.
Her kommer jeg til å lytte på den aktuelle porten
som kan være mest noe.
Og her er kode som er kanskje minner mer om nå
av Laravel og routes.php.
Så dette er kveldsmat enkel, jeg er bare kommer til å angi en rute
for slash stjerne, så alt kommer til å bli absorbert
av denne forespørselen behandleren.
Paradigmet for forespørselshåndtereren er dens anonym funksjon
med en forespørsel argument
og en respons objekt akkurat som før.
Og res.send på ekspress midler du sende koden etterfulgt
etter hva du ønsker å sende.
Og selvfølgelig, kan du gjøre noe mer avansert
ved å faktisk sende filer eller HTML
eller dynamisk generert innhold.
Men for nå, alt vi gjorde ble spyttet ut hallo, verden.
Hvis vi går inn i serveren tre, Dette er enda mer avansert bare
vise deg noe av funksjonaliteten.
Og vi skal vise deg en enda mer sexy versjon
av dette på onsdag.
Men hvis du noen gang har hørt av Socket IO kanskje,
slik som jeg tror Jonathan eller noen sa tidligere,
en av de tingene node er virkelig kjent
for er sin sanntid atferd, ikke sant?
Tenk om PHP i MySQL, hvis du var å gjennomføre en chat-server
i PHP der to personer kunne åpne et nettleservindu til foo.com
og deretter begynne IMing hver andre, Alice i ett vindu,
Bob i en annen, slik at hver av dem ser sin
eller hennes meldinger i det andre vinduet.
Hvordan ville du gjøre dette i PHP og MySQL?
Ved hjelp eller ikke hjelp Laravel sorter av uvesentlig, kan du ha
som en index.php fil.
Og du må ha - i noen tilfeller er nødt til å spytte
ut av form, så det er kommer til å være en HTML-skjema
som trolig sender ikke via normalform innsending
men Ajax sannsynligvis, ikke sant?
Så, en på sende til behandleren, så du skriver inn i et tekstfelt,
du treffer inn og da blir det sendes til serveren via Ajax.
Hva gjør du da gjøre på server?
Så, har du fått index.php
eller noe prikk PHP som er mottatt i HTTP parameter
fra brukeren, Alice eller Bob direktemelding, hva gjør du
med det for å spre det til Bob eller Alice, henholdsvis?
Jeg mener du bokstavelig talt har verktøy som
å gjøre dette i min.
Så ut som hva ville du gjort?
Du har ett minutt til gjennomføre dette programmet.
Yeah?
[Hørbar Remark]
Perfekt. Høyre, så du har en database.
Vi vet litt litt om MySQL.
Så, har du en tabell det er meldinger,
kanskje det er en ganger stempel, en bruker-ID,
legemet av meldingen selv skapt det,
oppdatert det og alt det.
Så lagrer du i en database.
Og anta Alice sender første meldingen, hvordan får Bob
at meldingen nå fra databasen?
>> Det kan være noen Ajax respons som stadig kommer
tilbake til databasen Opp får [uhørlig].
>> Nettopp.
Så Bob kode som er kode er det samme som Alice er bare en slags
et symmetrisk forhold,
Bob nettleser har noen Ajax-kode det er nok kanskje hver 30
sekunder trekke den server via Ajax sync,
er det nye meldinger?
Er det nye meldinger?
Hvert 30. sekund kommer å være snill av suboptimal
fordi han må vente enda
hvis Alice bokstavelig nettopp sendt meldingen.
Så, kunne Bob nettleser hvert sekund treffer server.
Men det betyr Alices Nettleseren er treffer serveren
hvert sekund.
Hva om Charlie [Antatt staving]
og David [antatt staving] og Edward [antatt staving]
og alle andre brev av alfabetet?
Hva er problemet av denne tilnærmingen?
Mange treff dreven -
Jeg mener du er bare effektivt Dosering ditt eget syn
eller DDOSing, Distributed Denial of service angrep
på din egen side, ved å ha alt
av disse brukerne kjøre Java kode som bare pinge
pokker ut av serveren din selv om det vilkårlige tall,
80 prosent av tiden ingen har sagt noe
i chatterommet.
Men du bare sjekke å sørge for slikt.
Så PHP i en rekke språk er bare ikke bra
for sanntidskommunikasjon.
Fordi i PHP tilbakekalling er det ingen sentral minne, ikke sant?
Du har økt-gjenstander noe som skaper en illusjon
av sentral lagring, men det er på en per bruker-basis.
Du har ikke global minne som du gjør i en Java Servlet
i kjent eller i andre rammen fungerer sånn.
Node.js selv, om du har global minne fordi du har
én server, og at 'kan huske noe den ønsker
Omtrent alle brukere.
Og du kan fortsatt har en database.
Men det fine med node.js er også at det er mye bedre
enn noe som PHP og skape en illusjon
til å håndtere flere ting på en gang.
Og faktisk som i til side, kan du implementere chat-servere i PHP,
men du vanligvis ville gjøre noe som kalles lang polling
der du ikke pinge tjeneren hvert sekund.
Du pinge serveren, serveren ikke svare deg
for i overkant av 30 sekunder, det bokstavelig talt sitter
i en sløyfe venter og venter.
Og serveren kontrollerer om er det nye data i databasen
og bare en gang det du ser, "Oh, her er en melding fra Bob, "
svarer det til HTP server?
Så effekten i nettleseren din er at IE-ikonet eller Mozilla
eller hva bare fortsetter å spinne i 30 sekunder ad gangen.
Men oppsiden er, trenger du ikke har 30 tilkoblingsforespørsler
i 30 sekunder, har du en.
Så det heter lang polling.
Men enda bedre i moderne web lesere er noe som heter
WebSocket, som du tar CS143,
du effektivt kan lage en TCP-forbindelse fra en kunder
som en nettleser til en server og deretter henge på den
uten å bruke nesten så mange ressurser
som HTTP kanskje tradisjonelt gjør.
Og Socket IO er en node.js bibliotek
som gjør det mye enklere å gjøre kontaktforbindelser
eller illusjoner der på for gamle nettlesere
slik at du kan velge å implementere sanntid funksjonalitet tallet.
Så, her er et eksempel.
Dette ting opp toppen blir en litt mer komplisert
men det er stort sett kopier og lim fra socket.io 's dokumentasjon.
Her er nå en mer presis forespørsel behandleren.
Hvis brukeren ber om en slash, hvilken fil skal jeg
å være tilsynelatende tjene opp til dem?
Index.html.
Og det er noen nye ting her stream
som jeg skal vise deg på bare et øyeblikk.
Men dette er bare en annen måte
gripe en fil en Litt mer effektivt
enn bare å gjøre fs.readFile.
Det er litt smartere spesielt for store filer.
Så lang historie kort, disse linjene bare for å betjene
opp en fil som heter index.html
som for nå antar inneholder HTML-formen som Alice
og Bob kan intercommunicate.
Til slutt, io.sockets.on, så dette kommer fra denne linjen opp her.
Så, jeg bare lese dokumentasjon io.socket gir meg
adgang til et såkalt WebSocket med en nettleser,
mellom leseren og serveren.
Jeg lytter for spesielle event-tilkobling som middel
når brukeren først treffer serveren prøver
å åpne denne forbindelse, er jeg kommer til å kalle denne samtalen tilbake.
Og nå, jeg kommer å gjøre følgende.
Hvert femte sekund, hva skal jeg gjøre?
Jeg kommer til å avgi eller kringkaste hvis du husker scratch,
det grafiske språket ville at en kringkastings blokker?
Så, du kommer til å slippe ut
eller utløse et arrangement som heter vilkårlig fra server.
Og det kommer til å inneholde en melding Ping
og gjeldende dato.
Så, er dette en faktisk chat server som Alice
og Bob kan bruke, men det er liksom av en automatisert chat-server
hvor meldingene bare en slags sonar ping.
Det er bare date til tider som er blir sendt hvert femte sekund.
Så, hvis jeg faktisk kjøre denne ting - og det er det.
For å være klar her nede, varsel dette er bare å logge her nede.
Så, la meg slå et blinde øye til det.
La meg gjøre node av app.js.
La meg gå til nettleseren min.
Last hjemmesiden her.
[Pause]
Og la meg lukke inspektøren.
Hvert femte sekund, har jeg en demonstrasjonen selv om ikke
interaktiv for menneskelig
av noe som er skjer asynkront.
I nettleseren varsel, det er ingen roterende ikon.
Det er ved hjelp av en avansert funksjon av Chrome i moderne nettlesere
ved å opprettholde en sokkel forbindelse under panseret
og det er det som kalles generelt en pub / sub-modellen,
publisere / abonnere modell, hvor vi ikke har gjort
som ganske eksplisitt her.
Men det som er fint om dette generell pub / sub paradigmet er
at du kan ha en utgiver.
I dette tilfellet sentral server og alle
av de enkelte lesere er klienter.
Alices og Bobs av verden kan abonnere på den,
slik at du kan videresende meldinger blant mange brukere.
Og selv om igjen vi er ikke se interaktivitet,
Vi hadde kanskje 12 linjer med kode bare for å gjøre dette.
Og det er nok ikke et sprang å forestille seg hvordan du kan piske
ut filen index.html som har en sann HTML skjema
litt av jQuery kode med Ajax som ikke sender en dagtid
men bare sender uansett Alice eller Bob typen til serveren
og deretter serveren vil sende det videre ut.
Og jeg lover å skimte på en siste ting bare
å erte deg med dette.
Hvis vi går inn i strømmen null og en,
vil du se kode det er bare litt annerledes her.
Bare så du har sett det, Dette er en alternativ
til det jeg kalt fs.readFile metoden tidligere, der,
du kan fortelle node.js, "Go lese denne filen inn i minnet.
Men hvis det er stort bare gi meg en del om gangen. "
Og du kanskje kjenner fra CS165
eller 161 filsystemer har forskjellig
ytelsesegenskaper.
Du ønsker kanskje å lese i blokker på 512 bytes
eller to kilobyte eller hva.
Dette er en måte å optimalisere komme tilbake på filen iterativt
slik at du kan spytte det ut litt raskere
til nettleseren eller til hvem sluttkunden er.
Så enorm mengde innhold i dag og vi kommer til å dykke
mer i detalj på onsdag med Tim [antatt staving]
spesielt se på hvordan vi kan oversette noen av ideene
fra første halvdel av Kurset Laravel og modeller
inn i et bibliotek som han selv skrev kalt Bookshelf.js
som er blitt stadig mer populært i samfunnet
fordi det gir deg det meste av det,
hvis ikke mer enn funksjonalitet av veltalende
som husker er at bibliotek innsikt av Laravel,
så mer om det og mer hvordan
å utvikle full fledged apps på onsdag.
Vi vil du se da.