>> Okay.
Så cliffhanger var, hvad der er node.js som du kender det i dag?
Noget? Ja?
>> Det var ligesom en rammer skrive JavaScript
applikationer bredt -
>> OK, der virker.
>> - Jeg ved ligesom almindelige anvendelser som -
eller noget du kan gøre, er ligesom -
[Lydløs Bemærkning]
>> OK godt.
Ja, så det er en ramme.
Det er en motor, som du kan udføre JavaScript-kode
server site.
Dette kan betyde simpleste ting
som at skrive en kommandolinje script ikke i Python eller Bash
eller Ruby eller PHP, men blot i JavaScript selv
og udføre det på et blinkende kommandoprompt.
Eller du kan faktisk køre det inden for en web-server.
Og faktisk inden node.js selv,
denne ramme er en hel flok biblioteker blandt hvilke er
i HTTP server indbygget.
Så kan du faktisk skrive en server, som vi vil se
på bare et øjeblik, super nemt ved blot at forstå en smule
af HTTP og TCP og havne.
Og du kan gyde en lytter webserver uden Apache,
uden Microsofts IIS.
Uden nogen anden installeret software,
du kan bare gyde dette og lytte til de fleste enhver havn
på systemet, du får lov til.
Så sagen og point lad mig gå og åbne
op dette eksempel server-0.js.
Så bemærke, at toppen af denne fil, bare en flok
af uinteressante kommentarer og så er der et par
repræsentative linjer kode at vi vil se recurringly.
Så får var HTTP kræver "http".
Så indbygget i node.js ' infrastruktur er en hel flok
af moduler, som er virkelig bare biblioteker og alt er en slags
af navn plads med den entydige identifikator
som denne er "http".
Så det ligesom i en masse af sprog som Java og C + +
og C, kun når du importere eller omfatter
eller i knudepunkt tale kræver et modul gør sine bits.
Og hele hukommelsen kræver at få læsset
i RAM, og derfor anvendes.
Så du slags indlæse denne biblioteker eller moduler på efterspørgslen.
Det betyder gå videre og kræve
til dette program HTTP bibliotek,
og henviser til, at biblioteket ved i form af en variabel kaldet HTTP.
Men det venstre symbol kunne er blevet kaldt noget, foo,
bar, baz, betyder det ikke noget.
Så i modsætning til C + + og Java og C hvor når du har brug for
eller importere et bibliotek, det bare sortere
af bliver globalt tilgængelig,
node.js moduler er mere stramt namespace.
Så egen - denne funktionalitet er kun tilgængelig i øjeblikket
ved hjælp af denne variabel navn.
Du kan ikke bare starte typningsmetoder der findes
i det højre en måde der er sikkert godt,
fordi så dit namespace ikke får nær så rodet
som i en masse sprog.
Okay, så nu som fælles foreslå, at skabe en HTTP-server
da Jonathan [antaget stavning] var muligt er bogstaveligt talt
så simpelt som at kalde skabe server metode inde
af HTTP-modulet.
Så er denne tilbage reference
til en form for web-server.
Den kom til Apache, ikke nødvendigvis er så tung vægt.
Denne ene er lidt enklere.
Og nu er jeg nødt til bare bare gøre et par ting.
Så det første, lad mig rulle ned til bunden her
og springe handleren metode for et øjeblik.
Og bemærk denne linje kode,
server.on som er væsentligt betyder server -
lytte ligesom i jQuery kode,
lytte til et arrangement kaldet anmodning
og bare tage et gæt hvad skal jeg gøre
når en anmodning begivenhed brande i serveren.
Ja?
>> Ring funktionen handleren.
Så bogstaveligt udføre kode, der er refereres
af denne variabel og faktisk ikke en variabel til symbol her,
hvad er det symbol henvise til?
Nå, dette navn på fungere op her
og handler tilsyneladende tager to argumenter.
Hvorfor to? Tja, hvis du bare læse nogen dokumentation
for denne særlige modul, du vil blive fortalt, at handleren
der vil blive kaldt vil være bestået mindst to argumenter,
en henvisning til den anmodning,
og indersiden af ​​anmodning, vi bogstaveligt betyder HTTP-anmodning.
Så alle dem, HTTP headers som du måske husker
fra begyndelsen af semester eller nogle forudgående klasse
eller erfaring som få linje og værten linje
og User-Agent linje, alt dette er indkapslet og mere inde
af denne anmodning objekt.
Og genstanden respons sorteret til udgående data.
Så du har en henvisning til en indvende, at der kommer til at give dig
at sende oplysninger tilbage til browseren ved at kalde metoder
på sidstnævnte argument kaldet Res for svar.
Men dette kunne kaldes foo eller bar, dette er blot konventioner.
Så nu, hvad gør jeg?
Tja, fremgår det, at inde af denne super simpelt web-server
at jeg gennemføre, er jeg kommer til at gøre følgende.
Jeg har tænkt mig at skrive en HTTP header med status kode 200,
200 mening OK, alt er godt.
Og så jeg har tænkt mig at videregive tilsyneladende.
Hvad er datatype andet argument til højre hoved?
>> Det er et objekt?
>> Det er et objekt med hvor mange nøgler og værdier?
Blot én af hver, højre, én nøgle værdi par.
Så 'indhold type'.
Og den eneste grund Jeg citerer det her er
fordi bindestregen kan være conflated for et minustegn
eller noget lignende.
Så jeg er nødt til at citere det her, singe eller dobbelte anførselstegn.
Men igen fælles paradigme
i JavaScript kode er ofte enkelte anførselstegn i disse dage,
kolon og derefter værdien.
Så det er bare det såkaldte sind type.
Dette er en HTTP header der er bogstaveligt vil
at være tilfreds bindestreg typen kolon tekst skråstreg klart, at der foregår
sendes fra server til browseren
så browseren ved om du skal køre det som Rå tekst
eller HTML eller som en billede eller en film
eller en flash-fil eller noget andet.
Nu, hvor vil jeg faktisk ønsker at sende i kroppen på siden?
Nå, bare ved at læse dokumentationen
for objektet respons inde i dette bibliotek.
Jeg ser, at der er en ret metode og det tager en streng,
måske andre ting, men minimalt en snor.
Og strengen er, hvad der er spytte ud til browseren.
I dette tilfælde sin super enkel, dens hej verden,
men det kunne være opne beslag, html, close beslag,
åbneparentes hoved tæt beslag og så videre,
dette kunne være rå HTML.
Men vi holder eksemplet simpelt ved blot spytte
ud den enkleste i sindet typer der er velsagtens text / plain.
Og så response.end bare betyder lukke forbindelsen
og sende alt, hvad jeg har slags pufret inde
af dette objekt tilbage til browseren.
Jeg er færdig. Ok.
Så den sidste ting Jeg laver hernede
og dette er noget vilkårlig og beregnet til at være cool,
er jeg fortæller server endelig at lytte
på en bestemt TCP som standard port.
Recall fra start klasse, at tjenesteydelser -
eller du typisk entydigt identificere det af tal,
AD er på nettet, 443 er HTTP baseret hjemmesider, 22 er SSH, 21 er FTP
og 1337 er lige vilkårlig men det er højere end 1024
hvilket betyder på de fleste systemer, kan jeg bruge det
uden at behøve super brugerrettigheder.
Så det er bare praktisk.
Men 8080 er i off - en fælles en, 8088, virkelig noget stort
i tusindvis som fælles men det er bare mere elite.
Okay, så hvad der sker når jeg faktisk køre dette?
Nå, jeg ikke bare besøge siden i en browser.
Denne fil kaldes server-0.js.
Fordi igen, Apache er nu ude af billedet
for sidstnævnte halvdel af kurset.
Hvis jeg ønsker at web server, jeg har brug for at skrive
og derefter køre denne webserver.
Men det viser sig, at JavaScript både på klientsiden
og serveren side er et fortolket sprog.
Så alt hvad jeg behøver, er en tolk.
Så Det er - hvis insistere på at køre node og derefter server-0.js,
Jeg kan eller ikke kan se nogle output afhængigt
om, hvad bibliotekerne har jeg medtaget, intet synes at ske.
Men lad mig gå til en browser og lad mig gå
til den samme IP-adresse af mine CS50 klienter.
Men det kunne lige så godt være min Mac
eller min pc og derefter tryk enter.
Det ligner faktisk Apache.
Det er ligesom biblioteket notering vi kiggede
ved i første halvleg.
Så hvad gjorde jeg forkert?
Ja.
[Lydløs Bemærkning]
Præcis, right?
Så er Apache stadig lytter på standard port 80.
Selv om jeg kunne ændre det, Jeg kunne slukke det hele sammen
men det er stadig kører.
Men disse fyre kan sikkert sameksistere.
Jeg simpelthen nødt til at sætte colon 1337 og så måske
eller måske ikke en skråstreg på sidste ende at få adgang til denne port
at denne server kører på.
Og nu ser jeg, at hej, har verden vendt tilbage.
Og jeg kan ramme reload som mange gange, som jeg vil,
det er stadig tjener op en side.
Faktisk, hvis jeg åbner Chrome inspektør, gå til netværk
og derefter genindlæse hele siden,
bemærke, at ja det var anmodningen, der blev sendt.
Hvis jeg ser på Raw kilden,
mærke min browser sender alle disse ting.
Og så svar fra serveren var super enkel.
Der er 200.
Hvis det ikke er for lavt på skærmen,
der er den type indhold.
Og så node.js slags automatisk
for mig har tilføjet dato og alle de andre ting
at browsere typisk forvente.
Så lad os bare se en lille tilregnelighed check.
Lad mig gå tilbage til koden i server-0.js og lad mig -
hver gang jeg går ind i handleren,
lad mig bare sige console.log.
("Vi havde en besøgende! ').
Jeg behøver ikke at rekompilere eller noget lignende,
det er et fortolket sprog.
Så nu, lad mig gå tilbage til siden, genindlæse en, to,
tre gange, og gå tilbage til mit vindue.
Og nu kan jeg se det.
Nå det er mærkeligt, Jeg kan se seks linjer.
Interessant web trivia, hvorfor gjorde Jeg får seks anmodning ikke tre?
Ja?
[Lydløs Bemærkning]
Ja. Så, som du kan kende lidt dum ikonet i øverste
af browseren bar, at en masse
af hjemmesider anvendte magt være en Harvard våbenskjold,
det kunne være et firmalogo eller noget lignende.
Så browsere disse dage sortere
af formasteligt gøre en ekstra HTTP-anmodning
til næsten enhver hjemmeside, som Du besøger kontrol af, om der er
som standard en fil kaldet favicon.ico
i den samme mappe som den fil, du har anmodet om.
Og hvis ja, det sætter ikonet der.
Så alt vi ser er nøjagtigt.
Og i virkeligheden, lad os se om vi kan se dette snarere end typen
ud bare: "Vi havde en besøgende '.
Lad mig gå videre og output.
Og jeg kun kender det fra kigge på dokumentationen.
Der er en ejendom inde i anmodningen objekt kaldet URL
der sker for at være den vej
der blev anmodet om i selve URL.
Så hvis jeg genstarte serveren blot ved at køre node
på server-0.js og nu gør dette en, to,
tre og gå tilbage her.
Der er det.
Slash er, hvad jeg - den menneskelige anmodet
i favicon.ico er hvad browseren er
formasteligt anmoder om.
Men pointen er ikke så meget favicon stuff
men hvordan serveren betjenes.
Ja?
>> Hvorfor der har at være nogle anmodning?
>> Hvorfor har det at - i kraft af, hvordan HTTP virker.
Så kan HTTP kun anmode én fil ad gangen.
Browsere kan være smart i disse dage
og holde TCP forbindelse åben.
Hvis du tog CS143 eller generelt fortrolig med netværk,
så du kan få effektivitetsgevinster
ved at holde netværket socket åben
i at gøre flere HTTP anmodninger serielt end det
men de er en fil pr anmodning.
Så hvis du besøger noget lignende -
Jeg mener, vi kan gå til de fleste nogen hjemmesider.
Hvis du går til - lad os trække op Chrome inspektør her.
Det kan få tungest på siden.
Gå til fanen Netværk og gå til www.cnn.com.
Og når du besøger cnn.com, sin hjemmeside -
din browser temmelig afskyeligt gør - stadig tælle.
OK. Mindst 289 HTTP anmodninger igen og igen.
Og det er derfor, når du besøger særligt oppustet hjemmesider,
de er langsomme til at indlæse på grund af alle
af de aktiver, de er indlæst.
Så det ligner 298.
Der kan være nogle Ajax foregår på dette punkt eller nogle
af aktiverne er lige lave.
Så hver af disse er en individuel anmodning går tilbage
og tilbage, frem og tilbage.
Og det er derfor tidligere, selv selvom vi slags talte
om det noget fantasifuldt hvor du sætter script-tag,
absolut gør en forskel, når du har -
det begynder at have en masse trafik og en masse
af filer, der anmodes om.
Og hver af dette repræsenterer sandsynligvis et billede, en mediefil,
en JavaScript-fil, CSS-fil eller lignende.
Så vi er allerede op til ca 4 megabyte bare
at se på dagens nyheder.
Godt spørgsmål.
Ok.
Så hvad er nogle af upsides selv?
Okay, vi ved, hvordan man kan gøre websider allerede med PHP.
Og mange af jer kom ind til klassen at kende Django
og Python eller skinnerne med Ruby.
Så hvorfor har vi brug for endnu en sprog og infrastruktur?
Hvad er node.js særligt godt på, hvis du kender?
[Pause]
Nogle ting?
Nej? Ja?
>> Formidle meddelelser.
>> Så formidle meddelelser.
Så det er sandt, og det er sandt for en mere teknisk årsag
og at node.js og virkelig JavaScript er især
velegnet til asynkron kode,
hvis hvorved du opretter illusionen
til at gøre flere ting på én gang.
Så selvom de er virkelig sker serielt,
faktisk i de fleste tilfælde JavaScript både klientsiden
og server side er enkelt gevind.
Hvilket, hvis du tager 161 eller endda 61 betyder, at der -
af dette program ved,
tolken kan bogstaveligt talt kun gøre én ting på én gang.
Men det er ikke godt for noget som en webserver
hvor du måske har snesevis eller hundredvis eller måske endda tusindvis
af brugere forsøger at få adgang til din webside
på samme tid.
Og dog, der tyder der håndterer dem én
efter den anden efter andre, især hvis nogle
af dem, anmodning, som vi så på CNN kan kræve betjener
op 300 filer, før du endda komme til den næste bruger
der ønsker at se den, siger nyheder.
Node.js er bedre egnet til miljøer som.
For hvad der sker, er enhver langsom kørende proces
som at læse en fil fra disk eller søge i en database eller taler
til en anden netværksserver,
har tendens til at have latency, right?
Hvis du gjorde tage 61 eller 161 især alle af denne art
af perifere tjenester tendens til at være meget langsommere
end at gøre noget inde i samme RAM og samme CPU
at sige i dette tilfælde serveren faktisk kører.
Men hvad er rart om node.js er, at du kan -
og JavaScript mere generelt er, at du kan gøre noget
og derefter sige, "Hmm, dette foregår
til at tage mig et par millisekunder eller endda et par sekunder.
Lad mig slags gaffel at off " men det er ikke en ægte proces.
Og når det er gjort laver at langsom kørende proces
som fanger rækker fra en database eller læse en fil. html
fra disken, vil det komme tilbage til mig snarere
end mig at skulle vente på det.
Så for at gøre dette mere klart.
Dette er mine midler hvilket gør dette mere velkendte.
Okay, så dette er den Shake Shack på pladsen.
Dette er en slags fælles paradigme
til at forklare asynchronicity.
Dette er faktisk en god eksempelvis fordi Shake Shack
og Tasty Burger er bemærkelsesværdigt langsom for hvad de gør.
Men pointen er, at de er rigtig god til at tage imod ordrer
og tage dine penge efter som du venter på din mad.
Så det er faktisk en bedre design end alternativet.
Fordi antage, at du går ind i en butik som denne, og du fik
til forsiden af ​​den linje, og du afgivet din ordre, og du vil
til burger, så godt jeg kan fortælle, det tager mindst fem
eller flere minutter at faktisk få en burger.
Så ville det være venlig af en dårlig forretningsmodel
hvis mens du venter på din burger, Alice [antaget stavning]
og Bob [antaget stavning] og Charlie [antaget stavning]
og alle andre er kø bag dig
og du er bogstaveligt talt blokerer den linje venter på din mad.
Så selvfølgelig på Shake Shack
og andre fastfood steder ikke gør dette,
de gør noget som dette.
De giver dig en buzzer.
Og de slags sende dig på din vej.
Og de kalder dig tilbage med gøre denne lille ting vibrere
eller flash for at få din opmærksomhed.
Så dette er bogstaveligt talt hvad?
Noget lignende node.js gør.
Hvis node.js eller JavaScript mere generelt anvendes
og programmeringsenheden er smart nok
til at indse, "Ved du hvad?
Uanset hvad jeg har brug for at gøre ret her kan tage noget nummer
millisekunder eller sekunder.
Ved du hvad?
Lad mig gå videre og ikke kalder det synkront -
"Det er guy blokering alle andre i linje, "-
lad mig gå videre og slags træde til side
og bare kalde mig tilbage
når det lange løb operation er færdig. "
Og ringe tilbage selvfølgelig hentyder i dette tilfælde
til en callback funktion, en henvisning til en borepatron kode
der vil få udført når din burger er klar,
meget gerne denne ting har nogle slags funktionalitet indbygget
at det begynder at ryste eller summende når det er tid for dig
at blive kaldt tilbage til forsiden af ​​linjen.
Så hvad gør dette betyder i reelle tal?
Nå, vi er nødt til arbejde vores vej op.
Så lad mig gå videre og gøre dette først.
I server-1.js, lad mig først forenkle koden
så vi kan tage små skridt i retning af et mere overbevisende problem.
Det er nøjagtig den samme program, som jeg skrev før.
Men hvad der er blevet ændret?
Der er en slags lille syntaktiske forskel
mellem dette og udgave 0 for et øjeblik siden.
Hvad springer ud på dig, hvis du husker?
Ja Cynthia [antaget stavning]?
[Lydløs Bemærkning]
Ja. Så nu har vi en linje funktion væltes i.
Vi har fået fjernet den slags
af unødigt navngivne handleren funktion.
Useless kun i, at før selv kalder det på ét sted,
Jeg har ikke rigtig brug for spilde tid på at give den et navn
og gør det sværere at læse koden fra top til bund.
Så lad os bare erklære inline er en anonym funktion.
Og jeg laver to andre ting.
Jeg gør bedre anvendelse af dot notation.
Så ligesom i jQuery, en masse knude metoder kan kædes sammen.
Så når du er færdig ringer noget, du ikke har
at vente til en ny linje og kalder en anden metode,
du kan bare kæde dem sammen.
Og så på denne måde, kan vi virkelig stramme det op.
Så det er bogstaveligt talt en web-serveren i fem linjer
kode samlede modsætning til -
i modsætning til hvad du måske normalt skal gøre for at sætte noget op.
Hvis jeg går ind i server 2. nu, lad os gøre det.
I server 2 - faktisk lad os komme tilbage til denne server 2.
Lad os nu åbne asynkron-0.js og løse dette problem ved hånden.
Så det første, lad os gå fremad og åbne
op async-0.js i browseren.
Så async-0, så lad mig gå tilbage til browseren.
Hit reload.
Og nu, det er lidt af fejlmeddelelse.
Faktisk jeg ser en 500 i Chromes inspektør.
Men lad mig mere præcist anmode hello.txt.
OK. Så det ser ud til at virke.
Så async-0.js synes ikke at tjene op noget for skråstreg.
Det har ingen standard fil støtte.
Men hvis jeg udtrykkeligt anmode hello.txt,
der synes at være støtte.
Hvorfor er det?
Nå, hvad jeg har gået her
og gjort gennemføres en super simpel webserver
, der viser, hvor asynchronicity kan være nyttigt.
Og der er implementeret som følger.
Først, jeg ved hjælp af HTTP-modul igen,
men også FS som sandsynligvis står for?
Generelt i CS, filsystemet.
OK filsystem.
Derfor frem FS, filsystem.
Okay, så hvad betyder det giver mig?
Funktionalitet relateret til filer som at få vedtaget,
åbning af filer, skrive mapper, læsning biblioteker
og alle den slags ting.
Så nu mærke til, denne kode er den samme som før,
oprette serveren, der passerer i en anonym funktion.
Dette er en slags vilkårlig.
Dette er ikke en meget sikker web-server.
I virkeligheden kunne du få adgang til de fleste helst fil på min harddisk
eller serveren hårde drev ved at udføre denne kode
fordi jeg er bare blindt antage, at jeg har tænkt mig
at få fat i hvad brugeren anmodet om i webadressen.
Og jeg har tænkt mig at præfikset det med prik
så jeg er marginalt være sikker
ved at sige, hvad fil de kan Ansøgningen skal i det mindste starten
i den aktuelle mappe.
Selvfølgelig er der en trussel her.
For hvis de i stedet omfatte hvad?
På deres vej, kan de slags af arbejde omkring det også.
Dot, prik, right?
Så hvis brugeren bare sætte prik, punktummet i webadressen, i teorien,
de kunne begynde at få mit - og sige password fil.
Så er det ikke meningen skal fastgøres,
det er beregnet til at være enkel.
Så her, jeg har en variabel, der er sammenkædningen af ​​dot
der er til stede bibliotek og anmodningen URL
som vi så før, er ligesom skråstreg eller / hello.txt.
Så nu, det bliver en lidt mere interessant.
Bemærk først bunden.
Jeg lytter på samme port som før.
Så den virkelige interessant arbejde er inde i her.
Hver gang en anmodning kommer af natur
af denne kode, hvad gør jeg?
Jeg ringer fil systemets læse fil-metoden,
passerer stien at jeg vil læse.
Og nu, dette er hvad der er interessant her,
dette er ved implementering asynkron metode.
Du kan ikke få et afkast værdi fra læse-fil.
Faktisk meddelelse, der er ingen venstre udtryk
til venstre for læse-fil.
Det betyder ikke returnere en værdi.
Tværtimod, det kalder et tilbagekald fungere, når det er klar
at give dig tilbage et svar.
Så igen at være klar, hvorimod i Gårsdagens
i mange programmering sprog, hvis du ønsker
at læse en fil sag i punkt PHP,
fil understregning få underscore indhold,
du har en venstre-hånd udtryk i alt værdien efter -
før lighedstegnet, det betyder, at du tildele
til denne variabel afkastet værdien af ​​denne funktion.
Du kan gøre det i node.js, men du typisk har
at kalde eksplicit synkron versioner af funktionerne vil,
Jeg tror, ​​det er læst sync fil eller synkronisere læse filen.
Jeg har glemt, hvordan de navngivet det.
Og det ville give du en returværdi.
Men hvis filen er på nogle fjernfilsystemet
eller disken er bare naturligt langsom, det kan tage 10 millisekunder
eller 2 sekunder for filen til rent faktisk at komme tilbage.
I mellemtiden, ingen andre web besøgende bliver serviceret
af din websit.
Du blokerer.
Det er, hvad der kaldes blokerende IO, input / output.
Så her, det er meget smartere.
For hvad node.js går
at gøre ved at fortolke er følgende,
det kommer til at kalde read fil-metoden,
prøv at én op filen, hvem der har en vej angivet af værdien P.
Og så, hvis og når den er klar at give dig tilbage indholdet
af filen P, vil det ringe en funktion, hvis signatur er
ved konventionen af ​​følgende.
To argumenter, hvor den første der er måske en fejl objekt,
kapital E, det er et objekt kaldet Fejl eller Null
hvis der ikke er en sådan fejl.
Og det andet argument - at tage et gæt - kommer til at være, hvad?
Det kaldes data naturligvis, men hvad der er data mere konkret?
>> Indhold?
>> Indholdet af hello.txt i eksemplet jeg trak
op i min browser et øjeblik siden.
Så med andre ord til at læse filen og mange node.js funktioner
gerne på ikke vender tilbage værdier.
De kalder tilbagekald og videregive
disse tilbagekald hvad ville har traditionelt været den
returværdi.
Fordelen ved denne metode er
at man kunne kalde læse filen et T0.
Den callback funktion måske ikke kaldes et kryds senere
så at sige ved T, det kunne kaldes en T1000,
tusind flåter senere.
Men pointen er, at resten af ​​koden i denne fil,
hvis nogen ville straks udføres mens node.js
og mens filsystemet ud af at læse
denne fil og få det tilbage til dig.
Så du oprette denne -
så effektivt illusionen
af parallelitet og samtidig lade langsommere kørende processer er ikke
blokere de vigtige ting, den del, servicering brugere.
Så hvordan kan vi håndtere dette?
Dette er en meget almindelig node.js paradigme.
Og der er vejen bare for at forenkle dette er, at vi vil se før sammen.
Jeg først kontrolleres, om Fejl er ikke nul.
Så hvis det ikke er falsk så var der en fejl.
Jeg ved ikke, hvad det er, måske filen findes ikke.
Jeg havde ikke tilladelser.
Stinavnet er forkert.
Enhver række ting kunne gå galt.
For nu, vil jeg vilkårligt returnere 500
der er intern serverfejl.
Noget gik galt.
Jeg ved ikke rigtig pleje at diagnosticere den.
Så lad os bare fortælle brugeren det er brudt.
Og så jeg har tænkt mig at gøre res.end,
og dette er forkortet notation.
Husk, at sidste gang jeg gjorde res.write
og så gjorde jeg res.end.
Hvis du kun ønsker at sende en linie af output,
du kan bare gøre det hele på én gang med res.end med et argument,
og det kommer til at sende uanset fejlmeddelelsen
indersiden af ​​dette objekt til browseren.
Det var temmelig lysbue huske et øjeblik siden.
Jeg har ingen idé om, hvad denne betød ved første øjekast.
Men når jeg anmodede om en fil, der ikke eksisterer -
Ups, vi nødt til at køre serveren igen.
Når jeg anmodede om en fil , som ikke eksisterede, EISDIR,
så noget om det er biblioteket,
hvis jeg gør nogle tilfældige streng der,
tilsyneladende det betyder, at filen ikke eksisterer.
Og det er fordi min kode er blot at sige at skrive
ud, hvad Raw Fejlmeddelelse er,
så ikke meget brugervenlig men i det mindste jeg håndterer den.
Else, hvis det ikke var en Fejl Hvad laver jeg?
Samme ting som før spytte ud af en 200 OK, en almindelig -
text / plain sind type og derefter spytte ud dataene.
Og det er derfor, jeg får den indholdet af hello.txt som netop
at bekræfte, hvis jeg kiggede ved hello.txt,
det er bogstaveligt talt bare hej, verden.
Og hvis jeg ændret dette hej, verden, gem filen,
gentages serveren, genindlæse siden.
Nu får jeg denne version.
Så har jeg virkelig bare genimplementeret en webserver
som er eksisteret i mange år, men ved hjælp af node.js.
Men vi kan gøre det endnu mere rent.
Lad mig åbne op async-1.js.
Nu opdager jeg tilføjer et andet modul på dette tidspunkt,
tilsyneladende stien modulet.
Nu, dette er en god mulighed for at se
på, hvad dokumentation ser ud.
Node.js er dokumentation.
Ligesom PHP jeg synes er faktisk temmelig god
og ligetil.
Hvis jeg går til node.js og Google og søg efter node.js vej,
hvad du vil se normalt er et direkte link til en URL
at jeg sat op her for et øjeblik siden.
Så / API er det officielle sted at gå til dokumentation.
Og hvad du vil se i toppen
node officielle dokumentation er alle de metoder og
eller egenskaber inde i dette modul,
hvoraf den ene kaldes deltage.
Og slutte er hjælperfunktion der kommer til at tillade mig
at ikke gider med alle plusser.
Og det har den ekstra bonus som du kan se
fra havnen, er det også normaliserer den resulterende bane.
Så hvis brugeren eller du har prikker eller prikker prik eller en kombination
af disse former for relativ stier, blandt upsides
af den sammenføjede metode er, at det kommer til at rense alt det op
og give dig en kanonisk vej uden
af disse prikker eller dot prikker.
Så det er en god ting i generelt for sikkerheden i det mindste
hvis du tjekker det returnere værdi, som jeg ikke
i dette særlige enkel sag.
Men jeg ønskede at bruge det.
Så jeg nu oprette stien en lidt mere programmatisk
med path.join stedet af Raw sammenkædning.
Så det er lidt renere end før.
Og nu mærke jeg er en lidt mere intelligent snarere
end bare blindt prøv at læse filen,
Jeg har tænkt mig at der faktisk kalder fs.stat.
Så hvis du er fortrolig
med lav-niveau C funktioner og C, selv PHP.
En masse af biblioteker har denne funktion statistiske returnerer
væsentlige statistik på en fil, filstørrelse,
tilladelserne, navnet og sådan noget,
og også implicit hvis filen findes eller ej,
og hvis det er en fil eller mappe
eller symbolsk link eller noget andet.
Så nu mærke til, er jeg ringer fs.stat.
Og så tilsyneladende ifølge til dokumentationen,
Jeg skal komme tilbage i fejl objekt
eller Null fulgte af en statistik objekt.
Men lad os se det, node.js.fs.
Her er den fil dokumentation.
Lad mig se efter statistik.
Der er meget mere funktioner her.
Ups, at stat sync, fs.stat.
Så her er det asynkron statistik (2).
Det er altså hvis du husker fra hovedsider,
kapitel 2 hovedsiden
det betyder, det er bogstaveligt talt blot en knude gennemførelsen
af det lave niveau systemets funktion stat.
Så tilbagekald får to argumenter, fejl og stat
hvor stat er en fs.stats indsigelse.
Så lad os se, hvad dette objekt formodes at se ud.
Lad os klikke på hyperlinket og jeg ser det.
Den statistik objektet indeholder tilsyneladende nogle helper metode
er fil, er bibliotek, er en masse andre ting.
Det er de "er" fil at jeg holder om i dette særlige tilfælde.
Så her jeg går.
Hvis der var en fejl, lad mig lige kaution denne gang
og påtage sig.
Hvis der er en fejl, det var sandsynligvis en 404 fil ikke fundet.
Det kunne være noget andet
men jeg bliver lidt doven her bare for at fokusere
på de mere interessante detaljer.
Men for brugerens formål, er filen ikke findes,
hvis der var nogen fejl angivelse af filen.
Ellers lad mig kontrollere, om fil rent faktisk er et fil.
Så hvis det ikke er en fil, findes det.
Der er noget der, men det er nok en mappe
eller måske et symbolsk link
eller noget andet, der er funky på filsystemet.
Enten måde, at brugeren bør ikke se det.
Så nu jeg bare at spytte
konventionelt uautoriseret 403.
Men igen bare en konvention,
Jeg kunne have brugt noget andet i teorien.
Og så endelig, lad mig prøv at læse filen.
Så lad mig rulle ned.
Og nu mærke til dette er, hvor koden kan få lidt rodet,
bemærke, at jeg ringer fs.readFile passerer
i den samme vej, samme tilbagekald som sidste gang,
så den tidligere version.
Og så hvis jeg ville finde -
hvis jeg ikke finder det, Jeg spytter ud af 500.
Og hvis jeg finder det, hvad linje vil vi se her?
Vi kommer til at se fs skrive header 200 sandsynligvis
og en res.end afsendelse de faktiske data.
Men bemærke dette.
Og det er ikke demonstrativ af det værst tænkelige scenarie.
Men jeg har denne stat opkald her end jeg har nogle ting.
Så jeg har en anden asynkrone opkald her,
så mere indrykning.
Så bare slags ekstrapolere hvis du kunne herfra.
Hvilket problem har tendens til at opstå med det sprog som JavaScript
i dette miljø, hvor du ikke har returværdierne
men du har disse tilbagekald.
Og selvfølgelig, det er bare en stilistisk ting den kendsgerning
at jeg holder indrykning.
Men tag dette til logisk næste skridt.
Antag at der var et eller to eller tre andre funktioner
at jeg havde brug for at udføre den havde karakter asynkron
og derfor skal du lige slags holde indrykning til at håndtere dem,
til at håndtere dem, til at håndtere dem.
Du får slags tilbagekald helvede som folk kalder det
hvor din kode starter at få meget bred
og helt ærligt virkelig svært at læse.
Som det er, jeg kan sortere på knap fortælle, at dette er en slags flow
der har denne slags
af stilistisk vinklet ting foregår her.
Så det er ikke ideelt, fordi dette kan meget hurtigt blive
uhåndterlige, selv om to asynkron ikke kræver
sådan en big deal.
Så kunne vi undgå dette, right?
Du har måske et glimt at Jeg misclicked et øjeblik siden.
I dokumentationen, du ved, det ser ud som om der er statSync.
Og statSync tager ikke en tilbagekaldsanmodning som et argument.
Det tager bare den vej, fordi det tilsyneladende gør hvad?
Den returnerer en instans af fs.stats.
Så det kan være din første instinkt, ikke sandt?
Især hvis callback funktioner
og asynchronicity er en lidt nyt for dig, helt ærligt,
den nemmeste fremgangsmåde er sandsynligvis bare undgå problemet alle
sammen, gå tilbage for at sortere af CS101 stil programmering
hvor du kalder funktionen eller metode returnerer værdien,
opkaldsfunktion, returnerer værdien,
funktionen returnerer værdien.
Og jeg kunne bruge derfor fs.statSync
som er bogstaveligt talt den samme men det er en synkron udgave
hvilket betyder, at det vender tilbage værdien.
Det betyder ikke passere en værdi til et tilbagekald.
Men hvorfor skulle det nok være en suboptimal løsning at ty
til synkrone funktioner?
Ja?
[Lydløs Bemærkning]
Præcis, det tager lang tid.
Du er bare langsommere alt ned.
Fordi meget gerne Shake Shack eller Tasty Burger, hvis de sluppet
af disse buzzere og gjort dig, kunden står foran
af linje, indtil din mad er klar før selv tager rækkefølgen
af personen bag du naturligvis
gennem put langsommere.
Folk begynder forlader, du slags tegne pakker.
Du kan gøre et vilkårligt antal analogier her.
Men kort sagt, er det sandsynligvis ikke en god ting
for erhvervslivet eller for serveren.
Så asynkron kode er typisk mindst god
i denne sag, men det helt sikkert begynder at forårsage en vis angst.
Og i virkeligheden, jeg tør sige, når først at skrive det her,
det vil tage lidt smule af at vænne sig til.
Så lad os begynde at udstyre dig med nogle biblioteker
og teknikker til at gøre dette lidt lettere.
Så en af ​​de mest almindelige biblioteker er populære biblioteker
disse dage, dette man kaldte async.js.
Og som en masse node.js biblioteker eller moduler,
disse er alle open source.
De næsten alle bor og få hub repositories som er form
af blive de facto sted at gemme disse ting.
Og så er der en hele infrastrukturen
til installation af disse ting kaldet NPM, Node Package Manager
som hvis du er fortrolig med EvanTube er venlig
af lignende app eller app får.
Hvis du er fortrolig med Red Hat og Fedora
som i apparatet, det er ligesom yum.
Men det er en knude - det er en pakke leder bare
for denne særlige miljø.
Så kan vi hente og installere ting som async biblioteket
og også en anden kaldet underscore modulet eller biblioteket.
Men disse så langt fs, HTTP, sti,
de er alle kommet indbygget i knudepunktet.
Så hvis vi går til API docs, du faktisk se, at bygget
i node du får gratis en hel masse moduler.
Men masser af gode folk på Internettet har gjort snesevis
hvis ikke hundredvis af andre biblioteker
at gøre tingene bedre eller forskelligt.
Så lad os tage et kig på hvordan dette bibliotek fungerer.
Så de fleste af denne kode er identisk for øjeblikket.
Jeg har en sti være skabt op øverst.
Og nu jeg ringer async.series.
Så async bibliotek, det er bare et bibliotek, der giver dig
at passere eller hæve typisk funktioner til at blive kaldt en
efter den anden blot at slags undgå at indrykning spørgsmål
og virkelig bare den mentale angst, der vil uvægerligt opstå
mindst når du først dykke ind på dette på egen hånd
med programmering asynkront.
Som i side, hvis du har taget 161 og du har behandlet med låse
og hæve betingelser og alle af det, asynkron kode
og et miljø som node.js er faktisk meget,
meget enklere nok
end rent faktisk at skrive flertrådede kode.
Hver gang du har flertrådede kode,
du har raise forhold.
Du er nødt til at bekymre sig om to tråde, der indeholder
om de samme ressourcer disk eller hukommelse.
Skønheden i JavaScript
i node.js er der bogstavelig talt kun én tråd,
hvilket betyder, at browseren
eller serveren kan kun gøre én ting på én gang.
Det er bare op til dig, programmøren
at holde en mental model for hvordan du slags kø ting
og finde ud af hvordan at bestille din kode.
Men du aldrig behøver at bekymre dig om hæve betingelser
på helt samme måde på mindst med Raw kode som denne.
Så det er lidt svært at grack her.
Men - Så lad mig åbne op docs for bare et øjeblik.
Den async.js bibliotek, som ligeledes er meget googleable,
det lever i GitHub repot ligesom en masse af dem.
Tror ikke det er overfladisk, er det ikke.
Lad mig rulle ned til Read Me her.
Så asynkron bibliotek giver en hel masse
metoder inde i det.
For eksempel er der en metode, der kaldes hver,
som, hvis jeg klikker på dette blot at se sine docs for et øjeblik,
dette er en funktion eller metode der giver dig mulighed for at gøre noget
som en fire hver men parallelt.
De er alle kommer til at ske potentielt parallelt.
Og metoden er hver kun vil vende tilbage til dig, når alle
af iterationer er komplette.
Så måske de sker den ene efter den anden.
Ideelt set, de sker væsentlige parallelt.
Men metoden ikke ringe tilbage til dig.
Det betyder ikke Buzz din buzzer indtil alle
af de elementer, du har iterated løbet har gennemført.
Så det er bare en dejlig måde
for at undgå anvendelse af en simpel fire løkke
men faktisk gør noget asynkront.
Men nu mere direkte relateret til dette eksempel,
bemærke at der er dette serie metode.
Og lad mig bare trække op en simpelt kanoniske eksempel.
Så async biblioteker serie metode tager på som underforstået
af de firkantede parenteser i array.
Hvad er de data, typer af elementer
i dette array baseret på et simpelt eksempel?
Dette er en vifte af funktioner.
Så i C, ville du kalde dem til at fungere pointers.
I JavaScript, der er mere korrekt refererer til funktioner
eller anonyme funktioner.
Og det betyder bare, arrays
selvfølgelig er bestilt fra nul på op.
Så, opretholdt en ordre, som er god
for en serie, fordi serien selvfølgelig midler at gøre noget
for ikke parallelt.
Så dette betyder blot, at dette Funktionen vil blive henrettet,
så er denne ene, så er denne en, denne ene, så denne ene,
dog mange der er
indtil endelig den valgfri tilbagekald kaldes.
Så mærke paradigme her.
Og selvom dette er en fyr bibliotek,
det er repræsentativ for den meget almindelig JavaScript paradigme
af igen ved hjælp af tilbagekald.
Så mærke til, hvad du gør her.
I den første funktion, der gået ind via dette array,
du har defineret en anonym funktioner blot med funktion.
Men bekendtgørelse, der tilsyneladende i henhold til denne dokumentation,
at anonym funktion bør tage et argument tilbagekald.
Det kommer til at være en pegepind eller en henvisning til en funktion
at du skal ringe til, når din kode er klar til at returnere en værdi.
Så igen, i modsætning til for bare typisk proceduremæssig programmering
hvor du er vant til returnere værdier øjeblikkeligt
at én forskel ved hjælp af et bibliotek som denne
i asynkron programmering mere generelt, er, når du er klar
til at returnere en værdi fra en database, fra en fil,
fra en aritmetisk udtryk, er det op til dig
at kalde callback funktion.
Og det gode om dette bibliotek
hvis vi læser docs mere omhyggeligt, er,
hvis og kun hvis alle det tilbagekald område kaldet
uden Fejl objekt, vil det hele lykkes?
Så med andre ord, hvis der er 2,
hvis der er 10 anonyme funktioner
i dette array derfor i denne serie,
kun hvis alle af dem lykkes,
vil den endelige valgfri tilbagekald blive betragtet som en succes?
Hvis nogen af ​​dem mislykkes, hver funktion
efter at det ikke vil endda blive henrettet.
Så det er en pæn måde at sortere have en kæde
der afbryder for tidligt hvis noget går galt.
Så for at se dette i sammenhæng her er, hvordan vi kan re-implementere
det foregående program.
Jeg får stien som før, så dette er den nemme del.
Jeg kopiere indsætte denne skelet kode
fra den dokumentation, der async.series åben parentes,
åbne firkantet beslag.
Og nu mærke til jeg har en funktion i denne begyndelse
af et sekund, vil vi se hvor vi går fra dette.
Og nu mærke til, er det en lidt kompliceret ved første
men nøjes med at fokusere på det linie for linie.
Fs.stat betyder få statistikken eller hvad ikke af denne vej.
Kald dette tilbagekald, når klar.
Denne kode er den samme som før.
Hvis der er en fejl, der er en forskel nu.
Igen meget almindelig paradigme i node.js programmering er
hvis noget går galt, og et tilbagekald brug for at vide
at ved konvention, den første argument til en tilbagekaldsanmodning går
at være noget, hvis alt er godt eller et reference til et fejl objekt,
kapital E. Det er ligesom en fejl klasse, der findes globalt
men mere om det en anden gang.
Så ved at gøre dette, hvis der er en fejl, hvad er konsekvenserne?
Nå baseret på hvad jeg sagde serien gør,
er, hvis noget går forkert, vi bare slags ønsker
at afbryde hele serien af anonym funktion opkald.
Så er det tilstrækkeligt for mig at bare returnere tilbagekald passerer
i fejl objekt.
Fordi hvis stat gav mig tilbage en fejl,
Jeg kunne skabe en ny Fejl genstand for min egen,
men jeg er virkelig ligeglad med,
Jeg ønsker blot at passere uanset fejl er der faktisk ske
så jeg kan videregive det dette tilbagekald.
Og bare for at være klar, afkast er ikke strengt nødvendigt.
Jeg hovedsagelig ønsker at gøre dette men jeg ville nu behøver "vende tilbage;
/ / Således at ikke mere kode udfører ".
Så igen en anden almindelig konvention i JavaScript,
selvom du ikke er returnerer en værdi i sig selv,
du ønsker at passere værdien til callback funktion
men så du ønsker for at stoppe kørslen
af den funktion, du er i den trivielle måde
at gøre dette er blot at ringe tilbage her.
Men der er intet galt,
Vi laver bare tilbagevenden tilbagekald fejl, selvom det går
at vende tilbage i udefineret værdi.
Okay, dette gør returnerer en værdi mest sandsynlige.
Alt jeg bekymrer mig om er en boarding yderligere udførelse.
Så mit sammenblanding af disse to linjer er blot en stylist
til konvention bare til har antallet af linjen
kode jeg lige skrev 2-1.
Så hvad ellers?
Hvis der ikke er en fejl -
faktisk at være klar Jeg kunne også undgå
at ved at gøre, hvis ellers.
Men igen, en anden fælles paradigme er kontrol
for dine fejl op toppen og derefter bare returnere snarere end at fortsætte
at indrykke din kode med elses og elses og elses.
Så hvis det ikke er en fil, nu, du ved,
Jeg ønsker at håndtere dette lidt specielt.
Så her ligesom i Java eller C + + eller et par andre sprog,
her er hvordan kan instantiere et objekt til at skrive fejl passerer
i en standard besked af ikke en fil
og dette er blot noget vilkårlige.
Men jeg signalering en fejl på min egen.
Og hvad betyder dette sidste line formentlig betyde?
Alt er godt.
Hvis du passerer i null for den fejl parameter, der bare betyde
efter sædvane alt er godt.
Så det betyder, hvad vil ske logisk?
Hvis nul er passeret til tilbagekald
det betyder denne anonyme Funktionen er lykkedes
så at sige.
Så hvad skal serien Metoden går forud og nu behøver baseret
på min verbale definition tidligere?
[Lydløs Bemærkning]
Gå videre til den næste, right?
Hvis det havde returneret en ikke-nul værdi, ville det bare afbryde
og ikke mere anonym Funktionen vil blive kaldt.
Men fordi det ikke har, så dette vil få kaldes næste.
Så logikken i her er stort set den samme som før
og vi vil se, hvordan du rengør dette yderligere op i et øjeblik.
Jeg er klar over det er lidt af et parti
at absorbere alle verbalt og visuelt.
Men nu mærke, den anden anonym funktion, som jeg ønsker
at udføre i serien er at forsøge at læse filen.
Kald dette tilbagekald når du er klar.
Hvis der er en fejl, bare signalere det ved hjælp af tilbagekald
således at resten af denne ting afbryder.
Else tilbagevenden null.
Men hvorfor skal jeg passerer i to argumenter?
Nå denne gang, hvis jeg læser filen og komme tilbage
som en variabel kaldet data
Jeg vil ikke kun betyde alt er godt ved at returnere null
for det første argument.
Jeg ønsker at vende tilbage den faktiske data som det andet argument.
Fordi hvis jeg læser videre i dokumentationen,
bemærke dette sidste stykke kode kantet parentes betyder, at der er
slutningen af ​​serien.
Der var kun to anonym funktioner i denne serie.
Hvis der var en fejl her, så Jeg ved, at et af linkene
i denne kæde, så tale mislykkedes.
Så med andre ord, denne fejl kommer til at være en fejl objekt
der er nul, hvis en af disse fyre mislykkedes.
Og hvis det er tilfældet, er jeg bare kommer til at springe ud, og jeg har tænkt mig
sige 400, som betyder anmodning mislykkes,
det er meget generisk fejlmeddelelse.
Og så jeg har tænkt mig at udskrive fejlmeddelelsen.
Så jeg ikke generer være super anal dette tidspunkt,
Jeg har ikke tænkt mig at skelne mellem 500 og 404 og 403,
Jeg er bare lidt blindt vinke min hånd
og sige noget gik galt.
Men hvis intet gik galt,
Jeg har tænkt mig at sende dette res.end passerer denne data.
Nu er dette ser lidt kryptisk.
Men igen, hvis jeg læser dokumentationen,
det andet argument til denne sidste, afsluttende tilbagekald,
den fyr, som kun udføres når serien er gjort
udførelse eller en del der af, vil dette være et array
af alle de andet argument
der blev overført til tilbagekald.
Nu viser det sig, at linker kun i denne serie
der faktisk tilbage til andet argument er denne ene her.
Så jeg har tænkt mig at sortere på en troens spring blot bruge formoder
til det øjeblik, Sidstnævnte er en metode
som giver dig den sidste elementer i et array.
Fordi dette array der bliver gået
for mig har to indicies, nul og én.
Det er bare nul har ingen værdi fordi denne fyr vender tilbage -
ikke passere i en anden argument, men denne fyr gør.
Så resulterer beslag nul er ingenting,
resultater beslag en indeholder hvad
hvis du har fulgt sammen op til dette punkt?
Den fil, hej, verden indhold formodentlig
så det er sådan jeg faktisk udskrive det.
Og lad mig slutte en detalje her.
Hvis jeg gør denne slags gamle skole, hvis jeg ønsker at få
på de sidste elementer, hvis jeg kunne gøre resultater [results.length-1],
Det er slags af old school måde
få adgang de sidste elementer i - eller nul indeks array.
Men som i siden, husker at jeg havde dette bibliotek
heroppe understregning som ved Konventionen er blot kaldes
bogstaveligt en understregning særpræg, der er ikke noget særligt,
det bare ser cool ud dollartegn gør for jQuery.
Dette er blot en hjælper metode underscore prik sidste
der gør nøjagtigt det samme.
Og hvis du aldrig har brugt det før understregning JS både
for klientsiden kodning
og server side er en vidunderligt nyttigt bibliotek
at så mange mennesker, der er beskrevet det gerne jQuery indeholder alle
af de metoder folk ønskede kom med JavaScript selv.
OK.
>> Så som temmelig til mig og Jeg var ser i serien,
du har ligesom tilbagekald som et argument?
>> Ja.
>> Ligesom så når du faktisk gerne skub, i,
og ligesom hvad betyder det mener, når du bare nødt
ligesom tilbagekald og derefter gøre lignende -
[Lydløs Bemærkning]
>> OK, godt spørgsmål.
Så lad mig trække op async hovedside her
eller dokumentation på GetHub.
Så det er den kanoniske struktur.
Hvis du ringer bruger dette særlig metode serie,
Der er to store dele til det.
Den ene er en vifte af anonyme funktioner
og to er en endelig tilbagekald funktion, der er faktisk
udføres ved meget slutningen af ​​serien.
Nu, hvis vi zoomer ind en lidt tættere på den første
af disse store ting, den vifte af anonyme funktioner
ved krav i denne fyrens dokumentation har
at være en anonym funktion, der tager
i ét argument kaldet tilbagekald eller foo eller bar, er det ligegyldigt
men han kalder det tilbagekald.
Og det er en slags din buzzer at Shake Shack hænder du.
Dette er den måde, hvorpå du kan returnere en værdi
til kunden, fordi du kan ikke bare bogstaveligt vende tilbage.
Du er nødt til at gøre det ved vejen for dette tilbagekald.
Fordi hvis indersiden af ​​denne Funktionen er nogle langsomme løb
kode som forespørgslen database, læse filen fra filsystemet,
du ikke ønsker at vente der og blokere alle andre,
du ønsker at ringe til tilbagekald.
Så det er bogstaveligt talt navnet argumentet.
Men ligesom i C, du have funktion pointers.
I Java har du referencesystem metoder
og det samme her i JavaScript.
Dette er en variabel, men dens type er funktion.
Så blot ved at skrive sit navn hvorvidt et tilbagekald eller foo
eller bar, så åben parentes og tæt parentes,
du udfører, at på denne funktion.
Og passerer et nul som betyder nul fejl og en
hvilket betyder det er data, som jeg ønsker at passere i.
Og så luns at være klar, det er en anden tilbagekald.
Og det er ikke kaldet tilbagekald,
det bare begrebsmæssigt er et callback metode funktion
fordi det kaldes definition
af denne forfatters biblioteket, når hele serien har afsluttet
eller en delmængde heraf, hvis en er sket fejl før.
Så navn callback funktion, kalde callback funktion,
navnet på callback funktion, kalde callback funktion,
forskellige tilbagekald fungere alle sammen.
>> Vi har nu ligesom definere tilbagekald?
>> Nej, fordi denne fyr vil passere ind i dit array
af anonyme funktioner,
en pointer til koden han ønsker at udføre.
Præcis, okay.
Så skal du sige, at kode bliver lidt nemmere.
Så kan det.
Og hvis du ligesom mig, tage trøst i det mindste vide,
det tager et stykke tid at vænne sig til dette.
Men vi kan rense dette op en lille smule,
ikke at smide for meget på dig men her er en anden variation
og en anden metode
i det samme bibliotek kaldet vandfald.
Fordelen heraf er modsætning serie, hvor hver
af de anonyme funktioner udføres hovedsagelig
uafhængigt af hver af de andre.
Waterfall som navnet antyder giver de øverste funktioner
at slags passere i værdier til den nedre funktion,
Lidt ligesom en kaskade af vand.
Så opadrettede af dette er, at jeg kan slags
af bruge dette til min fordel.
I async.waterfall, bemærke følgende.
Jeg kan bare ringe fs.stat passerer stien
at jeg ønsker at få statistikker om.
Og husk så, før jeg havde en anonym funktion
der havde to argumenter fejle,
esultater og så jeg kaldte callback funktion manuelt?
Med andre ord er bare for at være klar, huske, at tidligere
i async 2, jeg gjorde alt af denne modbydelige arbejde.
Jeg kaldte fs.stat gået i P,
erklæret min egen anonym funktion.
Jeg kontrolleres derefter, hvis fejl er ikke nul da jeg gjorde det,
ellers jeg gjorde det, det hele skønhed følgende konventioner
ligesom i node.js er, at tilbagekald funktioner i almindelighed er beregnet
at tage mindst ét ​​argument, Fejl objekt efterfulgt af nul
eller mere nyttige værdier.
Så mærke paradigme her,
denne callback funktion jeg erklære følger nøjagtig den
paradigme, at denne fyr async bibliotek gør.
Hvilket vil sige dette, hvorfor er Jeg gennemføre min egen tilbagekald
metode, når forfatteren af ​​denne Biblioteket er bogstaveligt rakte mig
på et fad, så at sige, en callback funktion jeg kan bruge?
Så kan jeg bare passere i referere han har givet mig
således at det samme, min flere linjer
kode bliver én linje kode.
Nu, hvor går vi hen med dette?
Den næste funktion, Jeg ønsker at udføre,
næste anonyme funktion i dette array
funktioner gør følgende.
Notice første stat er det første argument.
Så noget har ændret allerede.
Nu, dette fyr, der skrev biblioteket -
og jeg siger guy fordi det er en dreng.
Denne fyr, der skrev dette bibliotek er dokumentation garantier
at hvis denne funktion her passerer mig tilbage Fejl objekt
eller nul efterfulgt af koma adskilt liste af andre værdier,
han vil sørge for, at dem, andre værdier er afleveret
til denne anonyme funktion i rækkefølge fra venstre mod højre.
Og hvad der plejede at være bare en callback funktion alene simpelthen
bliver den sidste argument.
Nu ved jeg ikke, hvem jeg er fokusere på blot du kender.
Men nu, hvad er det tage væk her?
Så vi kender fra dokumentationen
eller forudgående par eksempler
at fs.stat i sidste ende forventer en tilbagekaldsanmodning med to argumenter,
Fejl objekt, som er en Fejl objekt eller null fulgt
med en henvisning til statistik indsigelse.
Så hvis jeg tænker over det, Fejl objekt koma statistik indsigelse,
der passer i paradigmet af denne persons bibliotek.
Så kan jeg blot sige, fordi Jeg har ikke det andet argument
at det er - der kommer at blive vedtaget ved fs.stat
til tilbagekald er err, statistik ved definitionen af ​​dette bibliotek
Jeg kan sætte den anden argument navn her
eller hvad jeg kan omdøbe det
hvis jeg vil følges af tilbagekald her.
Så kan jeg passere en værdsætter herfra til her.
Nu er alt dette kode selv ganske vist lidt kryptiske er
mindst kopiere pasta til det meste fra før.
Den eneste forskel er varsel her jeg erklære en fejl
objekt og nu ønsker jeg at få en smule mere avanceret.
Jeg rent faktisk ønsker at vide, hvad fejlen var, så jeg har tænkt mig
at putte inde i dette objekt en ejendom vilkårligt kaldet kode
så jeg ved, at dette er ikke en fil
der bør være uautoriseret, det er en HTTP 403.
Lad mig til at huske, at før Jeg passerer Fejl objekt
til tilbagekald.
Og så endelig prøve at læse filen, så i dette tilfælde,
vandfaldet, jeg har brudt koden fra to store skridt
i tre mindre trin.
Læg mærke til skønheden her,
Jeg kan ringe fs.readFile passerer i stien.
Og så den hårde del mentalt, er jeg bare passere
i fyrens tilbagekald.
De ting, han rakte mig, jeg er kommer til at passere til fs.readFile.
Fordi vi alle overholde de samme konventioner
første argument til et tilbagekald er Fejl objekt eller null fulgt
af koma eller separeret liste over nyttige ting.
Så, hvad det betyder nu, og hvis jeg læs dokumentationen jeg vil vide
dette, den allersidste tilbagekald, denne fyr her udenfor
af de firkantede parenteser går at være bestået Fejl objekt
eller nul som jeg skal tjekke for som altid med denne kode.
Og derefter ved definitionen af denne fremgangsmåde
i fyrens dokumentation, det sidste returnerede værdi
fra den sidste metode i min anonym array -
min vifte af anonyme funktioner.
Så hvad betyder læse filen afkast
og jeg bruger en tilbagevenden løst nu.
Jeg mener, hvad kan læse fil pass som argumenter
til tilbagekald metoden sin hånd?
To argumenter, først er Fejl objekt eller null,
der er næsten altid kommer til at være svaret.
Og den anden ting går at være, hvad for læse-fil?
Indholdet af filen, data, som vi kaldte det tidligere.
Så ved blot at erklære err, resultat,
og tjekke for fejl dette er slags kedelige nu.
Else, jeg gør res.end passerer dette resultat.
Dette vil uden tvivl ikke synkronisere perfekt
indtil du rent faktisk skrive det selv.
Men for nu, tage væk mindst den kendsgerning
at der tilsyneladende dette fælles paradigme, hvor hvis vi
og forfattere af biblioteker alle slags pind
med denne konvention af callback metoder.
Og det første argument er Fejl objekt eller null.
Og den anden og tredje
og fjerde genstande er ting vi bekymrer os om, og vi slags
af følge reglerne og dokumentation.
Vi startede med kode, ærligt er temmelig grim.
Og selvom den seneste eksempel er ærligt talt lidt svært
at pakke dit sind omkring, det er mindst visuelt,
ligner det er meget strammere.
Og når du får komfortabel med det, det er så meget lettere
og det er så meget mindre tilbøjelige til at bugs end det foregående eksempel.
Så lad mig demonstrere en sidste ting her.
Dette er version tre.
Og - Nej, lad os forlade dette alene.
Lad mig gå ind i et par Andre last ting som teasere.
Okay, så i server 2.
OK. Først nogen spørgsmål, Jeg ved, det er en meget
men du ville have mere anvisninger, så?
Du sagde ikke god instruktion nødvendigvis.
Ja?
[Lydløs Bemærkning]
Korrekt, er du hovedsageligt lempelig til operativsystemet
at finde ud af at jonglere alle disse bolde på én gang,
læsning fra en fil, læsning fra en database.
Og det er denne JavaScript-server selv, der er enkelt gevind.
Og i det væsentlige og faktisk,
der er ét billede Jeg har ikke kaste op,
og det er ikke nødvendigvis alt, oplysende
men måske vi vil give dig en mental model.
JavaScript selv og node
i særdeleshed har denne såkaldte begivenhed loop.
Hvorved, kan du tænke af node.js, programmet
er bogstaveligt talt som en uendelig løkke.
Det er bare en vild løkke, venter og venter og venter,
på udkig efter opgaver at udfylde.
Og opgaven kan gå hente noget fra en database
eller her er en værdi fra database eller gå få denne fil
fra disk eller her er en anmodning fra en bruger.
Enhver form for begivenhed, ligesom browsere hændelsesstyrede
så serveren side event drevet.
Og nogen af ​​disse ting udgøre begivenheder.
Så nogen i node.js, bare skrev en uendelig løkke,
en stor vild løkke, venter efter ting til at ske.
Og som ting sker, er det ender i en kø, right?
Bestemt, en database kan returnere en værdi.
Og et filsystem, operativsystemet system kan returnere en værdi
på nogenlunde samme tid men der er nok at gå
at være nogle sorterer dem.
Og node.js kommer til at har i alt væsentligt en kø
som en stor matrix eller en vektor, nogle datastruktur
der buffere alle af disse ting.
Fordi det kan bogstaveligt talt kun håndtere én af dem ad gangen.
Så når du, udvikleren,
skriver asynkron JavaScript kode ved hjælp af asynkron
funktion, du lade dette såkaldte begivenhedsløkke at gå
til næste kryds, højre?
Så længe du straks vende tilbage som alle
af disse asynkrone metoder gør som læse fil og stat,
de vender tilbage straks fordi tilbagekald til sidst
kommer tilbage.
Så snart du vender tilbage,
det betyder en anden kan få dukkede bestanden her
eller at det kan blive dukkede foran køen her.
Og så er der i Faktisk serialisering
af alt det, der sker,
selvom alle disse ting kan ske parallelt
på en flertrådet system.
Men node.js selv og serveren kører
som en tråd.
Og den negative side af det er t du ikke nødvendigvis max
ud af din computers kapacitet er så specielt
hvis du har en 16 kerne eller selv en 2 core computer
og du bare kører én forekomst af node.
Men hvis du har igen taget noget som 161
du undgå en enorm mareridt af hovedpine, når det kommer
til race betingelser og låse og Semaforens
og skrive virkelig den flertrådede kode,
så positive og negative.
OK. Så tilbage til den kode her, Lad mig foreslå, at vi starter
at forenkle tingene en lille smule.
Vi så server den ene en lille smule siden der lignede dette.
Så det er velsagtens temmelig simpel.
Men ligesom i verden af PHP, er der rammer
ligesom Laravel og der er ting som Rails og Django,
samme ting i node.js verden.
Og vi vil bruge mere tid på denne onsdag
og i det næste projekt.
Men hvis jeg går ind i en server 2 bibliotek,
bemærke et par paradigmer her.
Så dette er - der går at være et tilsvarende eksempel
men det er ved hjælp af en rammer kaldet express.js,
der er gratis open source software som Skinner og Django,
Ligesom Laravel, det er bare i sidste ende går
at være unappreciated dag Fordi vi har skrevet
sådanne simple eksempler.
Men tro os.
Dette vil meget hurtigt blive din ven
fordi det vil spare dig en masse TDS kode.
Og et fælles paradigme for en express.js ansøgning
at have en app.js eller server.js fil, der indeholder den logik
af dit program eller på mindst indgang.
Du kan have flere filer.
En node modul undermappe som har bibliotekerne
at du har downloadet Ligesom async
og udtrykke sig i andre.
Og så package.json, package.json ligner dette,
og du kan oprette det manuelt eller værktøj skabe det for dig
og det er bogstaveligt talt en JSON fil
og den interessante del er afhængigheder her.
Ligesom i Laravel, du havde at sælger biblioteket
og du havde at bekymre om pakker og gør -
faktisk opdatering med Håndværker eller lignende kommandoer,
bibliotekerne dig har installeret,
på samme måde med package.json her og du styre bibliotekerne
og versioner at du holder af.
Så hvis jeg har en package.json, Jeg kan simpelthen gøre NPM,
Node Package Manger installere, det kommer til at automatisk at søge
ved at package.json fil.
Se og se, det gør jeg har den nyeste version
af alle leverandører moduler
i en knude underscore moduler mappe her eller måske
i nogle forælder eller forfader bibliotek.
Og hvis ikke, det er kommer for at hente dem
og du vil se en hel flok
HTTP stuff foregår over tråden.
Så for eksempel, lad mig vise dig indholdet
node-moduler bare at udtrykke.
Lad mig gå videre og dristigt slette node moduler
så alt hvad jeg har nu, er dette.
Og hvis jeg NPM installere, vil du se, at det kommer til at læse
at package.json fil og vi har set output, der ligner
til dette i Laravel verden.
Det er at hente en hel masse ting, og det er
fordi express igen afhænger af en hel flok
af andre folks biblioteker.
Så alle disse er slags bliver downloadet rekursivt.
Indtil nu hvis jeg gør i LS igen,
Der er min node-moduler mappe tilbage
og udtrykke så tilbage.
Så det er bare en måde at forenkle pakkehåndtering.
Nu, hvis vi ser på det app.js fil, er dette vil
at være en tilbagevenden til vores tidligste webserver
hvor vi bare spytte ud "Hej verden".
Men læg mærke paradigmer her,
første kræver vi udtrykkelig modul, så har vi denne linje
af kode, som du kender fra dokumentationen.
Du bogstaveligt behandle det modulets variabel som en funktion,
så åben parentes tæt parentes betyder udføre den.
Det kommer til at tilsyneladende returnere noget vi vil
opfordrer generelt en app.
Hvordan fungerer det?
Jeg ved ikke rigtig.
Jeg vil lade en anden person, du kender, i den udtrykkelige verden skrive det.
Jeg har tænkt mig at nu stå på hans eller hendes skuldre, så
at gøre min ansøgning kører lidt enklere.
Her vil jeg lytte på den pågældende havn
der kunne være mest noget.
Og her er kode, der er måske mere minder nu
af Laravel og routes.php.
Så dette er aftensmad simpelt, jeg bare kommer til at angive en rute
for slash stjerne, så alt vil blive absorberet
af denne anmodning handleren.
Paradigmet for sagsbehandler er dens anonyme funktion
med en anmodning argument
og et svar objekt ligesom før.
Og res.send i udtrykkelige midler du sende koden fulgt
af hvad du ønsker at sende.
Og selvfølgelig kan du gøre noget mere avanceret
ved faktisk sender filer eller HTML
eller dynamisk genereret indhold.
Men for nu, alle vi gjorde blev spytte ud hej, verden.
Hvis vi går ind i server tre, dette er endnu mere avanceret bare
til at vise dig nogle funktioner.
Og vi vil vise dig en endnu mere sexet udgave
af dette på onsdag.
Men hvis du nogensinde har hørt af Socket IO måske,
så jeg tror Jonathan eller nogen sagde tidligere,
en af ​​de ting node er virkelig kendt
for er dens realtid adfærd, right?
Tænk PHP i MySQL, hvis du skulle gennemføre en chat-server
i PHP hvorved to mennesker kunne åbne et browservindue til foo.com
og derefter begynde at IMing hver anden Alice i et vindue,
Bob i hinanden, således at hver af dem ser sin
eller hendes beskeder i det andet vindue.
Hvordan ville du gøre det i PHP og MySQL?
Anvendelse eller manglende anvendelse Laravel slags af uvæsentlig, kan du få
som en index.php fil.
Og du nødt til at have - i nogle tilfælde er nødt til at spytte
ud af form, så der er kommer til at være en HTML-formular
der sandsynligvis har gjort ikke via normale form indsendelse
men Ajax sandsynligvis, right?
Så, en on indsende handleren, så du skriver i et tekstfelt,
du rammer ind og så bliver det sendt til serveren via Ajax.
Hvad gør du så gøre på serveren?
Så du har fået index.php
eller noget dot PHP, der er modtaget i HTTP parameter
fra brugeren, Alice eller Bob instant message, hvad gør du
med det formål at udbrede det til Bob eller Alice henholdsvis?
Jeg mener du bogstaveligt har de værktøjer, som
at gøre dette i din min.
Så gerne, hvad ville du gøre?
Du har et minut til at gennemføre dette program.
Ja?
[Lydløs Bemærkning]
Perfect. Right, så du har fået en database.
Vi ved lidt lidt om MySQL.
Så du har en tabel der er meddelelser,
måske er der en gange stempel, en bruger-id,
den brødtekst selv skabte det,
opdateret det, og alt dette.
Så du gemmer i en database.
Og formoder Alice sender første budskab, hvordan Bob får
dette budskab nu fra databasen?
>> Det kan være nogle Ajax respons, der er konstant gik
tilbage til databasen Foroven på [uhørlig].
>> Præcis.
Så Bobs kode, der er kode er det samme som Alice er bare sortere
symmetriske forhold,
Bob browser har nogle Ajax kode det er nok måske hver 30
sekunder trækker den server via Ajax synkronisering,
er der nye beskeder?
Er der nye beskeder?
Hvert 30. sekund går at være slags suboptimal
fordi han har at vente endnu
hvis Alice bogstaveligt lige sendt meddelelsen.
Så Bob browser kunne hver anden ramme serveren.
Men det betyder Alices browser rammer serveren
hvert sekund.
Hvad med Charlie [Antaget stavning]
og David [antaget stavning] og Edward [antaget stavning]
og hver anden bogstav i alfabetet?
Hvad er problemet af denne fremgangsmåde?
En masse hits for store -
Jeg mener, du er bare effektivt Dosering dit eget syn
eller DDOSing, Distributed Denial of service angreb
på din egen hjemmeside, ved at have alle
af disse brugere køre JavaScript kode, der er bare pinge
dælen ud af din server selvom vilkårligt antal,
80 procent af tiden ingen har sagt noget
i chatten.
Men du bare kontrol at sørge for en sådan.
Så PHP i en masse sprog er bare ikke godt
til tidstro kommunikation.
Fordi i PHP tilbagekaldelse er der ingen central hukommelse, right?
Du har session objekter som skaber illusionen
af central lagring, men der er på en pr bruger basis.
Du behøver ikke have den globale hukommelse ligesom du gør i en Java Servlet
i velkendte eller i andre ramme fungerer sådan.
Node.js selv, har du global hukommelse, fordi du har
én server, og at "kan huske noget det ønsker
om alle brugere.
Og du kan stadig har en database.
Men det gode ved node.js også er, at det er meget bedre
end noget som PHP og skabe en illusion
håndtere flere ting på én gang.
Og i virkeligheden som på side, kan du implementere chat-servere i PHP,
men du vil typisk gøre noget, der hedder lang polling
hvorved du ikke pinge serveren hvert sekund.
Du pinge serveren, server ikke svare dig
for op til 30 sekunder, det bogstaveligt talt sidder
i en løkke venter og venter.
Og den kontrol, server, hvis der er nye data i databasen
og kun én gang det, du ser, "Åh, her er en besked fra Bob, "
vil det svare til HTP-server?
Så effekten i din browser er, at IE ikon eller Mozilla
eller hvad bare holder spinding i 30 sekunder ad gangen.
Men opadrettede er, du ikke har 30 forbindelsesanmodninger
30 sekunder, har du en.
Så det hedder lang polling.
Men endnu bedre i moderne web browsere er noget der hedder
WebSocket, som du tager CS143,
du effektivt kan gøre en TCP-forbindelse fra en kunder
som en browser til en server og derefter hænge på det
uden brug af næsten så mange ressourcer
HTTP kan traditionelt gør.
Og Socket IO er en node.js bibliotek
, der gør det meget nemmere at gøre stikforbindelser
eller illusioner dér ved for gamle browsere
så du kan gennemføre denne realtid funktionalitet er.
Så her er et eksempel.
Denne ting op toppen får en lidt mere kompliceret
men det er mest kopiere og indsætte fra socket.io 's dokumentation.
Her er nu en mere præcis sagsbehandler.
Hvis brugeren anmode om et skråstreg, hvad filen skal jeg hen
at være tilsyneladende tjene op til dem?
Index.html.
Og der er nogle nye ting her stream
som jeg vil vise dig på bare et øjeblik.
Men dette er blot en anden måde
snuppe en fil et lidt mere effektivt
end blot at gøre fs.readFile.
Det er en lidt smartere især for store filer.
Så lang historie kort, disse linjer blot at tjene
op en fil kaldet index.html
der for nu antager indeholder HTML form, hvori Alice
og Bob kunne intercommunicate.
Endelig io.sockets.on, så det kommer fra denne linje op her.
Så jeg er bare at læse dokumentation io.socket giver mig
adgang til en såkaldt WebSocket med en browser,
mellem browseren og serveren.
Jeg lytter til særlig begivenhed forbindelse som midler
når brugeren først rammer serveren forsøger
at åbne denne forbindelse, er jeg kommer til at kalde dette opkald tilbage.
Og nu, jeg har tænkt mig at gøre følgende.
Hvert femte sekund, hvad jeg har tænkt mig at gøre?
Jeg har tænkt mig at udsende eller udsende hvis du husker bunden,
grafisk sprog ville at en udsendelse blokke?
Så er du nødt til at udlede
eller udløse en begivenhed kaldet vilkårligt fra serveren.
Og det kommer til at indeholde en besked Ping
og den aktuelle dato.
Så dette er et virkeligt chat server, Alice
og Bob kan bruge, men det er lidt af en automatiseret chat-server
hvor meddelelserne er lige slags sonar pings.
Det er bare dato på tidspunkter, der sendes hvert femte sekund.
Så hvis jeg faktisk køre dette ting - og det er det.
For at være klar hernede, varsel det er bare at logge hernede.
Så lad mig slå en blinde øje til det.
Lad mig gøre node app.js.
Lad mig gå til min browser.
Opdater hjemmesiden her.
[Pause]
Og lad mig lukke inspektøren.
Hvert femte sekund, jeg har en demonstration selvom ikke
interaktive til menneskeføde
af noget, der er sker asynkront.
I meddelelsen browseren der er ingen spinning ikon.
Det er ved hjælp af en mere avanceret funktion af Chrome i moderne browsere
opretholde en sokkel forbindelse under hætten
og det er det, der hedder generelt en pub / sub-model,
offentliggøre / abonnere model, hvor vi ikke har gjort
der helt eksplicit her.
Men hvad er nice om dette generel pub / sub paradigme er
at du kan have en udgiver.
I dette tilfælde central server og alle
af de enkelte browsere er klienter.
Alices og Bobs af verden kan abonnere på det,
så du kan overføre meddelelser blandt en række brugere.
Og selvom vi igen er ikke at se interaktivitet,
Vi havde måske 12 linjer kode bare for at gøre dette.
Og det er nok ikke et spring at forestille sig, hvordan du kan piske
ud index.html fil der har en ægte HTML-formular,
lidt af jQuery kode med Ajax, der ikke sender en dagtimerne
men bare sender uanset Alice eller Bob type serveren
og derefter serveren vil viderebringe det ud.
Og jeg lover at skimte på en sidste ting bare
at drille dig med dette.
Hvis vi går ind i strøm nul og én,
du vil se koden, der er lige lidt anderledes her.
Bare så du har set det, dette er et alternativ
til, hvad jeg kaldte fs.readFile metode tidligere, hvorved
du kan fortælle node.js "Gå læse denne fil i hukommelsen.
Men hvis det er stort bare give mig et stykke ad gangen. "
Og du måske kender fra CS165
eller 161 filsystemer har forskellige
funktionsegenskaber.
Du vil måske ønsker at læse i blokke af 512 bytes
eller 2 kilobyte eller hvad.
Dette er en måde at optimere komme tilbage fil iterativt
så du kan spytte det en lidt hurtigere
til browseren eller hvem slutkunden er.
Så enorm mængde indhold i dag, og vi kommer til at dykke
nærmere på onsdag i med Tim [antaget stavning]
navnlig se på, hvordan vi kan oversætte nogle af de idéer
fra den første halvdel af kursus Laravel og modeller
ind i et bibliotek, som han selv skrev kaldet Bookshelf.js
som er blevet mere og mere populære i samfundet
fordi det giver dig det meste af det,
hvis ikke mere end det funktionalitet veltalende
som husker er, at bibliotek indsigt Laravel,
så mere om dette og meget mere, hvordan
at udvikle fuldt udbygget apps på onsdag.
Vi ser du da.