>> Okej.
Så cliffhanger var, vad som är node.js som ni vet det idag?
Vad som helst? Yeah?
>> Det var som en ram skriver JavaScript
applikationer i stora drag -
>> OK, fungerar det.
>> - Jag känner som vanliga användningsområden som -
eller något du kan göra är som -
[Ohörbart Anmärkning]
>> OK bra.
Ja, så det är en ram.
Det är en motor med vilken du kan köra JavaScript-kod
serverplatsen.
Detta kan innebära att enklaste av saker
som att skriva en kommandorad skriptet inte i Python eller Bash
eller Ruby eller PHP, men bara i JavaScript sig
och köra den på en blinkande kommandotolken.
Eller du kan faktiskt köra den inom en webbserver.
Och i själva verket inom node.js själv,
denna ram är ett helt gäng av bibliotek bland vilka är
HTTP-server inbyggd.
Så kan du faktiskt skriva en server som vi får se
på bara ett ögonblick, super lätt genom att bara för att förstå lite
HTTP och TCP och portar.
Och du kan leka en lyssnande webbserver utan Apache,
utan Microsofts IIS.
Utan någon annan programvara installerad,
du kan bara leka här och lyssna på de flesta någon hamn
på system som du får.
Så fall och punkter, låt mig gå och öppna
upp detta exempel server-0.js.
Så märker att den övre delen av den här filen, bara en massa
av ointressanta kommentarer, och så finns det ett par
representativa kodrader att vi får se återkommande och.
Så, får var HTTP kräver "HTTP".
Så inbyggd att Node.js " infrastruktur är en hel massa
av moduler som är egentligen bara bibliotek och allt är typ
namnutrymme med den unika identifierare
som denna är "HTTP".
Så att som i en hel del språk som Java och C + +
och C, bara när du importera eller inkludera
eller i nod talar kräver en modul gör sina bitar.
Och allt minne kräver få laddad
i RAM och används därför.
Så, du slags ladda denna bibliotek eller moduler på efterfrågan.
Det innebär att gå vidare och kräva
för detta program HTTP-bibliotek,
och hänvisa till bibliotek genom sätt av en variabel som kallas HTTP.
Men denna vänstersymbolen kunde har kallats något, foo,
bar, baz, det spelar ingen roll.
Så till skillnad från C + + och Java och C där när du behöver
eller importera ett bibliotek, det bara typ
av blir globalt tillgänglig,
node.js moduler är tätare namespace.
Så att egna - att funktionaliteten är endast tillgänglig för tillfället
med hjälp av detta variabelnamn.
Du kan inte bara börja typningsmetoder som existerar
i det rätt sätt vilket förmodligen är bra,
för då din namnrymd blir inte alls lika rörigt
som i många språk.
Okej, så nu när den gemensamma antyder, att skapa en HTTP-server
som Jonathan [antas stavning] var möjligt är bokstavligen
så enkelt som att ringa skapa server metod inuti
HTTP-modul.
Så, är detta åter referensen
till någon form av webbservern.
Det kom till Apache, inte nödvändigtvis så tung vikt.
Den här är lite enklare.
Och nu måste jag bara helt enkelt göra ett par saker.
Så först, låt mig rulla ner till botten här
och hoppa över handler Förfarande för ett ögonblick.
Och märker här kodraden,
server.on vilket är huvudsak innebär server -
lyssna som i jQuery-kod,
lyssna efter en händelse kallas begäran
och bara ta en gissning vad ska jag göra
när en begäran händelse bränder i servern.
Yeah?
>> Kalla funktionen handler.
Så, bokstavligen utföra kod som är refererade
av denna variabel och faktiskt inte en variabel till symbol här,
vad är det symbol hänvisa till?
Nåväl, detta namn fungera här uppe
och handler tydligen tar två argument.
Varför två? Tja, om du bara läs ingen dokumentation
för just denna modul, du kommer att höra att föraren
som kommer att åberopas kommer att vara passerade minst två argument,
en hänvisning till denna begäran,
och insidan av begäran som vi bokstavligen innebära HTTP-begäran.
Så, alla som HTTP-huvuden som du kanske kommer ihåg
från början av den termin eller någon tidigare klass
eller erfarenhet som få linje och värd linje
och User-Agent linje, allt detta är inkapslad och mer inne
av denna förfrågan objekt.
Och svaret objektet sorteras för utgående data.
Så, har du en referens till en invändningar som kommer att tillåta dig
att skicka information tillbaka till webbläsaren genom att anropa metoder
på det sistnämnda argumentet heter Res till svar.
Men det skulle kunna kallas foo eller bar, detta är bara konventioner.
Så nu, vad gör jag?
Tja, verkar det som inne av denna super enkel webbserver
att jag genomföra, jag är kommer att göra följande.
Jag kommer att skriva en HTTP header med statuskoden 200,
200 börden OK, är allt väl.
Och då kommer jag att förmedla tydligen.
Vad är det för datatyp andra argumentet till höger huvud?
>> Det är ett objekt?
>> Det är ett föremål med hur många nycklar och värden?
Bara en av varje, till höger, en nyckelvärde paret.
Så, "innehållstyp".
Och den enda anledningen Jag citerar det här är
eftersom bindestreck kan vara sammanbinds till ett minustecken
eller något liknande.
Så, jag måste citera den här, singe eller dubbla citationstecken.
Men återigen gemensamt paradigm
i JavaScript-kod är ofta apostrof dessa dagar,
kolon och sedan värdet.
Så, detta är bara s.k. sinne typ.
Detta är ett HTTP-huvud som bokstavligen går
nöja bindestreck typ kolon text slash plain som händer
att sändas från servern till webbläsaren
så att webbläsaren vet om du vill köra det här så rå text
eller HTML eller som en bild eller en film
eller en flash-fil eller något annat.
Nu, var ska jag egentligen vill ha att sända i kroppen på sidan?
Tja, bara genom att läsa dokumentationen
för svarsobjektet Insidan av detta bibliotek.
Jag ser att det finns en rätt metod och som tar en sträng,
kanske andra saker men minimalt en sträng.
Och strängen är vad som är spotta ut till webbläsaren.
I detta fall dess super enkel, dess hello world,
men det kan vara opne fäste, html, nära fästet,
öppen fäste huvud, nära fästet och så vidare,
detta kan vara rå html.
Men vi håller exemplet enkelt genom att bara spotta
ur den enklaste av sinnestyper vilket är utan tvekan text / plain.
Och sedan response.end bara betyder stänga anslutningen
och skicka allt jag har slags buffrat inne
av detta objekt tillbaka till webbläsaren.
Jag är klar. Okej.
Så, det sista Jag gör här nere
och detta är något godtycklig och tänkt att vara cool,
är jag säger det server äntligen lyssna
på en viss TCP som standard port.
Minns från början av klass som tjänster -
eller om du vanligtvis unikt identifiera den med siffror,
AD är webben, 443 är HTTP-baserad webbplatser, är 22 SSH, 21 är FTP
och 1337 är bara godtyckligt men det är högre än 1024
vilket innebär att den mest system, kan jag använda det
utan att behöva super användarbehörighet.
Så det är bara bekvämt.
Men 8080 är i off - en gemensam en, 8088, verkligen något stort
i de tusentals som vanligt men det är bara fler elit.
Okej, så vad som händer när jag faktiskt kör detta?
Tja, jag inte bara besöka sidan i en webbläsare.
Denna fil kallas server-0.js.
Eftersom återigen, är Apache nu ur bilden
för den senare hälften av kursen.
Om jag vill webben server, jag måste skriva
och kör sedan denna webbserver.
Men det visar sig att JavaScript både på klientsidan
och serversidan är ett tolkat språk.
Så, är allt jag behöver tolk.
Så Det är - om insistera att köra nod och sedan server 0.js,
Jag kan eller inte kan se viss effekt beroende
på vilka bibliotek jag har inkluderat, ingenting verkar hända.
Men låt mig gå till en webbläsare och låt mig gå
till samma IP-adress av mina CS50 klienter.
Men detta kunde bara lika gärna vara min Mac
eller min dator och sedan tryck enter.
Det ser faktiskt ut som Apache.
Det är som katalogen notering vi såg
på i första halvlek.
Så, vad gjorde jag för fel?
Yeah.
[Ohörbart Anmärkning]
Exakt, eller hur?
Så, är Apache fortfarande lyssnar på standardporten 80.
Även om jag kunde ändra på det, Jag kunde stänga ihop allt
men det är fortfarande igång.
Men de här killarna kan säkert samexistera.
Jag måste helt enkelt sätta kolon 1337 och då kanske
eller kanske inte ett snedstreck slutet för att komma åt denna port
att den här servern körs på.
Och nu ser jag att hej, världen har återvänt.
Och jag kan slå reload som många gånger som jag vill ha,
det är fortfarande som betjänar upp en sida.
I själva verket, om jag öppnar Chrome inspektör, gå till nätverk
och sedan ladda om hela sidan,
märker att ja det var ansökan som skickades.
Om jag tittar på Raw källan,
märker min webbläsare skickar alla dessa saker.
Och sedan svaret från servern var super enkelt.
Det är den 200.
Om det inte är för låg på skärmen,
det finns innehållstypen.
Och sedan Node.js slags automatiskt
för mig lagt till datum och alla andra saker
att webbläsare förvänta typiskt.
Så, låt oss bara se en lilla sanity check.
Låt mig gå tillbaka till koden i server-0.js och låt mig -
varje gång jag går in i föraren,
Låt mig bara säga console.log.
("Vi hade en besökare! ').
Jag behöver inte kompilera eller nåt sånt,
det är ett tolkat språk.
Så nu, låt mig gå tillbaka till sidan, ladda ett, två,
tre gånger och gå tillbaka till mitt fönster.
Och nu ser jag det här.
Jo det är konstigt, Jag ser sex rader.
Intressant web trivia, varför gjorde Jag får sex begäran inte tre?
Yeah?
[Ohörbart Anmärkning]
Yeah. Så, som ni kanske känner till lite dum ikon i toppen
av webbläsaren bar som mycket
av webbplatser som används kanske vara en Harvard vapen,
det kan vara ett företags logotyp eller nåt sånt.
Så, webbläsare nuförtiden sorterar
av presumptuously göra en ytterligare HTTP-begäran
till nästan varje webbplats som du besöker kontroll om det finns
som standard en fil kallas favicon.ico
i samma katalog som filen du begärde.
Och i så fall, uttrycker det ikonen där.
Så allt vi ser är just det.
Och faktiskt, låt oss se om vi kan se det här i stället för typ
ut bara, "Vi hade en besökare".
Låt mig gå vidare och utgång.
Och jag vet bara detta från titta på dokumentationen.
Det finns en egenskap inuti begäran objekt som kallas URL
som råkar vara den väg
som begärdes i den verkliga adressen.
Så, om jag startar om servern helt enkelt genom att köra nod
på server 0.js och nu gör det en, två,
tre och gå tillbaka hit.
Där är det.
Slash är vad jag - den begärda mänskliga
i favicon.ico är vad webbläsaren är
presumptuously ansökande.
Men poängen är inte så mycket favicon grejer
men hur servern används.
Yeah?
>> Varför det har vara någon förfrågan?
>> Varför har det att - som på grund av hur HTTP fungerar.
Så, HTTP kan endast begära en fil i taget.
Webbläsare kan vara smart i dessa dagar
och hålla TCP anslutningen öppen.
Om du tog CS143 eller allmänt förtrogen med nätverk,
så du kan få effektivitetsvinster
genom att hålla nätet hylsa öppen
att göra flera HTTP förfrågningar seriellt över det
men de är en fil per förfrågan.
Så, om du besöker något liknande -
Jag menar att vi kan gå till mest alla webbplatser.
Om du går till - låt oss dra upp Chrome inspektor här.
Det kan få fylla de flesta på sidan.
Gå till fliken nätet och gå till www.cnn.com.
Och när du besöker cnn.com, dess hemsida -
webbläsaren ganska vedervärdigt gör - räknar fortfarande.
OK. Minst 289 HTTP ansökningar om och om igen.
Och det är därför när du besöker särskilt uppblåsta webbplatser,
de är långsamma att ladda på grund av alla
av tillgångarna som de läser in.
Så ser det ut som 298.
Det kan finnas vissa Ajax pågår vid denna punkt eller någon
av tillgångarna är bara lågt.
Så, är var och en av dem en individuell begäran kommer tillbaka
och tillbaka, fram och tillbaka.
Och det är därför tidigare, till och med även om vi liksom pratat
om det något fancifully där du sätter skripttagg,
absolut gör en skillnad när du har -
det börjar få en hel del trafik och en hel
av filer som begärs.
Och var och en av detta utgör förmodligen en bild, en mediefil,
en JavaScript-fil, CSS-fil eller liknande.
Så, är vi redan upp till cirka 4 megabyte bara
att titta på dagens nyheter.
Bra fråga.
Okej.
Så, vad är några av upsides men?
Rätt, vi vet hur man gör webbsidor redan med PHP.
Och många av er kom in till klassen veta Django
och Python eller skenor med Ruby.
Så, varför behöver vi ännu en språk och infrastruktur?
Vad är node.js särskilt bra på att om du vet?
[Paus]
Nåt?
Nej? Yeah?
>> Vidarebefordra meddelanden.
>> Så, vidarebefordra meddelanden.
Så det är sant, och det är sant för en mer teknisk orsak
och att node.js och verkligen JavaScript är särskilt
väl lämpade för asynkron kod,
om där du skapar illusionen
att göra flera saker samtidigt.
Så även om de är verkligen händer i serie,
faktiskt i de flesta fall, JavaScript både klientsidan
och serversidan är enda gängad.
Som om du tar 161 eller till och med 61 innebär att -
av detta program vet,
tolken kan bokstavligen bara göra en sak på en gång.
Men detta är inte bra för något som en webbserver
där du kan ha tiotals eller hundratals eller kanske tusentals
av användarna alla försöker för att komma åt din webbsida
på samma gång.
Och ändå, som tyder på som hanterar dem en
efter den andra efter det att andra särskilt om vissa
av dessa begäran som vi såg på CNN kan kräva servering
upp 300 filer innan du ens komma till nästa användare
som vill se den säger nyheterna.
Node.js är bättre lämpad för miljöer som det.
Därför att det som händer är något långsam löpning process
som att läsa en fil från disk eller att fråga en databas eller prata
till någon annan nätverksserver,
som tenderar att ha latency, eller hur?
Om du tog 61 eller 161 framför allt av detta slag
kringtjänster tenderar att vara mycket långsammare
än att göra någonting inuti samma RAM och samma CPU
att säga i detta fall servern är faktiskt igång.
Men vad är trevligt om node.js är att du kan -
och JavaScript mer allmänt är att du kan göra något
och sedan säga, "Hmm, detta kommer
att ta mig några millisekunder eller till och med ett par sekunder.
Låt mig sorts gaffel som off, " men det är inte en riktig process.
Och sedan när det är gjort gör som långsam löpning process
som att ta tag rader från en databas eller läsa en fil. html
från disk, kommer det komma tillbaka till mig i stället
än mig att behöva vänta på det.
Så, för att göra detta tydligare.
Det här är mitt sätt att vilket gör detta mer bekant.
Okej, det är så det Shake Shack på torget.
Detta är en slags gemensam paradigm
för att förklara asynkronitet.
Detta är faktiskt ett bra exempel eftersom Shake Shack
och Tasty Burger är anmärkningsvärt långsam för vad de gör.
Men poängen är att de är riktigt bra på att ta order
och ta dina pengar efter som du väntar på din mat.
Så, är detta faktiskt en bättre konstruktion än alternativet.
Därför antar att du går in en butik som denna och du fick
på framsidan av linjen och du gjort din beställning och du vill
till hamburgare, så gott jag kan berätta, det tar minst fem
eller flera minuter att faktiskt få en burgare.
Så skulle det vara snäll av en dålig affärsmodell
om medan du väntar på din hamburgare, Alice [antas stavning]
och Bob [antas stavning] och Charlie [antas stavning]
och alla andra är kö bakom dig
och du är bokstavligen blockerar linjen väntar på din mat.
Så uppenbarligen, på Shake Shack
och annan snabbmat platser gör inte detta,
de gör något sånt här.
De ger dig en summer.
Och de slags skicka dig på vägen.
Och de ringa tillbaka genom vilket gör denna lilla sak vibrera
eller blixt för att få din uppmärksamhet.
Så, är det bokstavligen vad?
Något liknande node.js gör.
Om node.js eller JavaScript mer allmänt används
och programmeraren är smart nog
att inse, "Vet du vad?
Vad jag behöver göra rätt här kan ta lite nummer
millisekunder eller sekunder.
Vet du vad?
Låt mig gå vidare och inte kalla det synkront -
"Det är killen blockering alla andra i raden, "-
Låt mig gå vidare och sorts stiga åt sidan
och helt enkelt kalla mig tillbaka
när den långdragna är klar. "
Och ringa tillbaka naturligtvis anspelar i detta fall
till en callback-funktion, en hänvisning till en chuck av kod
som kommer att få verk när din burgare är klar,
ungefär som den här saken har någon typ av funktionalitet inbyggd
att den börjar vibrera eller surrande när det är dags för dig
att kallas tillbaka till framsidan av linjen.
Så, vad gör detta betyder i reala termer?
Tja, vi måste arbeta oss uppåt.
Så, låt mig gå vidare och göra det först.
I server-1.js, låt mig först förenkla koden
så att vi kan ta baby steg mot ett mer övertygande problem.
Detta är exakt samma program som jag skrev innan.
Men vad har förändrats?
Det blir liksom en liten syntaktisk skillnad
mellan detta och version 0 en stund sedan.
Vad hoppar på du, om du minns?
Ja Cynthia [antas stavning]?
[Ohörbart Anmärkning]
Yeah. Så nu har vi en rad av funktion överförs i.
Vi har fått bort det slag
av uselessly namnges hanterarfunktion.
Useless endast i denna innan ens kalla det på ett ställe,
Jag vet inte riktigt behöver slösa tid att ge den ett namn
och gör det svårare att läsa koden topp till botten.
Så, låt oss bara deklarera inline är en anonym funktion.
Och jag gör två saker.
Jag gör bättre användning av punktnotation.
Så som i jQuery, mycket nod metoder kan kedjas ihop.
Så att när du är klar ringer något, behöver du inte
att vänta på en ny linje och ringa en annan metod,
du kan bara kedja ihop dem.
Och så på detta sätt kan vi verkligen skärpa detta.
Så, är det bokstavligen en webbserver i fem rader
av kod totalt till skillnad från -
till skillnad från vad man kanske normalt måste göra för att ställa upp något.
Om jag går in i servern 2 nu, låt oss göra detta.
I server 2 - faktiskt vi komma tillbaka till den servern 2.
Låt oss nu öppna upp async-0.js och itu med det problemet.
Så först, låt oss framåt och öppen
upp asynkrona-0.js i webbläsaren.
Så async-0, låt mig gå tillbaka till webbläsaren.
Hit reload.
Och nu är denna typ av felmeddelandet.
Faktum är att jag ser en 500 i Chromes inspektör.
Men låt mig mer exakt begära hello.txt.
OK. Så verkar det att fungera.
Så async-0.js inte verkar servera något för snedstreck.
Den har ingen standardfilen stöd.
Men om jag uttryckligen begära hello.txt,
som verkar vara stödjande.
Varför är det?
Tja, vad jag har gått här
och gjort genomförs en super enkel webbserver
som visar var asynkronitet kan vara användbart.
Och det är implementerad enligt följande.
Först, jag använder den HTTP-modul igen,
men också FS som förmodligen står för?
Generellt i CS, filsystem.
OK filsystem.
Därav vidare FS, filsystem.
Okej, så vad ger detta mig?
Funktionalitet relaterad till filer som blir passerade,
öppna filer, skriva kataloger, läsa kataloger
och alla såna saker.
Så nu märker, den här koden är densamma som tidigare,
skapa den server, som passerar i en anonym funktion.
Detta är typ av godtycklig.
Detta är inte ett mycket säker webbserver.
I själva verket kan du komma åt mest alla filer på min hårddisk
eller på serverns hård kör genom att köra den här koden
eftersom jag är bara blint antar att jag ska
att ta vad användaren begärs i webbadressen.
Och jag ska prefix det med prick
så att jag är marginellt vara säker
genom att säga vad fil de kan begäran måste åtminstone början
i den aktuella katalogen.
Naturligtvis finns det en risk här.
För om de istället omfatta vad?
I deras väg, kan de slag för att komma runt det också.
Dot, prick, eller hur?
Så, om användaren bara sätta punkt, punkten i webbadressen, i teorin,
de kan börja få min - och säga lösenordsfilen.
Så, detta är inte tänkt som skall fästas,
det är tänkt att vara enkelt.
Så här, jag har en variabel som är en sammansättning av dot
som är närvarande katalog och URL-begäran
som vi såg innan är liknande snedstreck eller / hello.txt.
Så nu blir det en lite mer intressant.
Först märker botten.
Jag lyssnar på samma port som tidigare.
Så den verkliga intressanta Arbetet är inne på här.
Varje gång en begäran kommer i sin natur
av denna kod, vad gör jag?
Jag ringer fil systemets read file metod,
passerar i banan att jag vill läsa.
Och nu, är detta vad som är intressant här,
detta är genom implementering i asynkron metod.
Du kan inte få en avkastning värde från läs-fil.
Faktum är att märka, att det är ingen vänsteruttryck
till vänster om läs-fil.
Det behöver inte returnera ett värde.
Snarare kallar det en återuppringning fungerar när den är klar
för att ge dig tillbaka ett svar.
Så återigen att vara tydlig, medan förr,
i många programmering språk, om du ville
att läsa en fil fall i punkt PHP,
fil streck få streck innehåll,
du har en vänsteruttryck i hela det värde efter -
före likhetstecknet, det betyder att du tilldelar
till den variabeln avkastningen värdet av denna funktion.
Du kan göra det i node.js, men du har normalt
att ringa uttryckligen synkron versioner av funktioner gillar,
Jag tycker det är läst synk fil eller synkronisera läsa filen.
Jag har glömt hur de heter det.
Och det skulle ge du ett returvärde.
Men om filen är på någon avlägsen filsystem
eller skivan är bara naturligt långsam, det kan ta 10 millisekunder
eller 2 sekunder för den filen att faktiskt komma tillbaka.
Under tiden, ingen annan web besökare servas
av din websit.
Du blockerar.
Det är det som kallas blockerande IO, input / output.
Så här är det mycket smartare.
För vad Node.js går
att göra vid tolkning är följande,
det kommer att ringa läs filen metoden,
försöker en upp filen som har fått en väg som anges av värdet P.
Och sedan om och när den är klar för att ge dig tillbaka innehållet
av filen P, kommer det kalla en funktion vars signatur är
enligt praxis följande.
Två argument, det första av vilket är kanske ett fel objekt,
kapital E, det är ett objekt kallas fel eller Null
Om det finns något sådant fel.
Och det andra argumentet - att ta en gissning - kommer att bli vad?
Det kallas data som uppenbarligen, men vad är data mer konkret?
>> Innehåll?
>> Innehållet i hello.txt i exemplet jag drog
upp i min webbläsare nyss.
Så med andra ord att läsa filen och många node.js funktioner
som åtmin inte returnera värden.
De kallar återbesök och passera
till dessa callbacks vad skulle har traditionellt
returvärde.
Fördelen med detta tillvägagångssätt är
som du kan ringa läsa filen en T0.
Callback-funktionen kanske inte kallas ett tick senare
så att säga vid T, det kan kallas en T1000,
tusen fästingar senare.
Men poängen är att det Resten av koden i den här filen,
om någon skulle omedelbart exekveras samtidigt node.js
och medan filsystemet listar ut hur man läser
filen och få det tillbaka till dig.
Så skapar du här -
så effektivt illusionen
av parallellitet och samtidigt låta långsammare processer som körs är inte
blockera viktiga saker, den del som betjänar användare.
Så, hur ska vi hantera detta?
Detta är en mycket vanlig node.js paradigm.
Och det finns sätt bara för att förenkla detta är att vi får se innan tillsammans.
Jag först kontrolleras om Fel är inte noll.
Så, om det inte är falsk då det uppstod ett fel.
Jag vet inte vad det är, kanske inte existerar filen.
Jag hade inte behörighet.
Sökvägen är fel.
Valfritt antal saker skulle kunna gå fel.
För nu kommer jag att godtyckligt tillbaka 500
som är internt serverfel.
Något gick fel.
Jag bryr mig egentligen inte att diagnostisera den.
Så, låt oss bara säga användaren den är trasig.
Och då kommer jag göra res.end,
och detta är en förkortning notation.
Minns att förra gången jag gjorde res.write
och då gjorde jag res.end.
Om du bara vill skicka en rad av produktionen,
du kan bara göra det på en gång med res.end med ett argument,
och det kommer att skicka vad felmeddelandet är
insidan av detta objekt till webbläsaren.
Det var ganska ljusbågar minns en stund sedan.
Jag har ingen aning om vad det här betydde vid första anblicken.
Men när jag begärde en fil som inte fanns -
oops, vi måste köra servern igen.
När jag begärde en fil som inte fanns, EISDIR,
så något om varvid det är katalog,
om jag gör några slumpmässiga sträng där,
tydligen det betyder att fil existerar inte ens.
Och det beror på att min kod är helt enkelt att säga att skriva
ut oavsett Raw Felmeddelandet är,
så inte mycket användarvänliga men åtminstone jag hanterar det.
Annars, om det inte var en fel vad gör jag?
Samma sak som innan spett ut en 200 OK, en slätt -
text / plain sinne typ och sedan spotta ut data.
Och det är därför jag får den Innehållet i hello.txt som just
för att bekräfta om jag såg vid hello.txt,
det är bokstavligen bara hej, värld.
Och om jag ändrade detta hej, värld, spara filen,
köra servern, ladda om sidan.
Nu får jag den versionen.
Så, jag har egentligen bara implementerats om en webbserver
såsom funnits i många år men med användning node.js.
Men vi kan göra det här ännu renare.
Låt mig öppna async-1.js.
Nu märker jag att lägga annan modul denna tid,
tydligen sökvägen modulen.
Nu är detta en bra möjlighet att titta
på vad dokumentationen ser ut som.
Node.js är dokumentation.
Liksom PHP jag tycker är faktiskt ganska bra
och rakt fram.
Om jag går till Node.js och Google och söka efter node.js väg,
vad ser du oftast är en direktlänk till en URL
att jag lägger upp här för en stund sedan.
Så / api är den officiella platsen att gå för dokumentation.
Och vad ser du på toppen
av nod s officiella dokumentationen är samtliga metoder och
eller egenskaper inuti just denna modul,
en av vilka kallas delta.
Och gå med är hjälparfunktion som kommer att tillåta mig
att inte bry sig om alla plussidan.
Och det har den extra bonus som du ser
från hamnen är det också normaliserar den resulterande stig.
Så, om användaren eller om du har prickar eller prick prickar eller någon kombination
av dessa typer av relativ vägar, bland upsides
av den sammanfogade metod är att det kommer att rensa allt upp
och ge dig en kanonisk bana utan något
av dessa punkter eller prick prickar.
Så det är en bra sak i allmänt för säkerhet i minst
Om du kollar på returnera värde som jag inte är
i detta särskilda enkla fallet.
Men jag ville använda den.
Så jag nu skapa sökvägen a lite mer programmatiskt
med path.join istället rå sammanfogning.
Så, det är en liten renare än tidigare.
Och nu märker jag att vara en lite mer intelligent snarare
än bara blint försöker läsa filen,
Jag ska faktiskt call fs.stat.
Så, om du är bekant
med låg-nivå C funktioner och C, med PHP.
Många bibliotek har denna funktion stat avkastning
väsentligen statistik på en fil, filstorleken,
behörigheter, namnet och sådana saker,
och även implicit om filen existerar eller inte,
och om det är en fil eller katalog
eller symbolisk länk eller något annat.
Så nu märker är jag ringer fs.stat.
Och då tydligen enligt i dokumentationen,
Jag skulle komma tillbaka på fel objekt
eller Null följde av en statistik objektet.
Men låt oss kontrollera detta, node.js.fs.
Här är en fil systemdokumentation.
Låt mig titta på statistik.
Det finns mycket mer funktioner här.
Oj, den stat synk, fs.stat.
Så här är det asynkrona statistik (2).
Det är vilket innebär att om du minns från huvudsidor,
kapitel 2 på huvudsidan,
det betyder att det är bokstavligt talat bara en implementering nod
av lågaktivt systemfunktion stat.
Så, blir det återuppringning två argument, fel och stat
där stat är en fs.stats invända.
Så låt oss se vad detta objekt är tänkt att se ut.
Låt oss klicka på hyperlänken och jag ser det.
Den statistik objektet innehåller tydligen någon hjälpare metod,
är fil, är katalog, är en massa andra saker.
Det är den "är" fil som jag bryr mig om i detta fall.
Så här går jag.
Om det fanns ett fel, då låt mig bara rädda den här gången
och ta på sig.
Om det finns ett fel, var det förmodligen en 404-fil hittades inte.
Det kan vara något annat
men jag är lite lat här bara för att fokusera
på de mer intressanta detaljer.
Men för användarens ändamål, är filen inte hittas,
om det fanns något fel anger filen.
Annars vill jag kontrollera om fil är verkligen en verklig fil.
Så om det inte är en fil, den finns.
Det finns något där men det är förmodligen en katalog
eller kanske en symbolisk länk
eller något annat som är funky på filsystemet.
Hursomhelst, användaren skulle inte se det.
Så nu kommer jag bara att spotta
på konventionellt sätt obehörig 403.
Men återigen bara en konvention,
Jag kunde ha använt något annat i teorin.
Och så slutligen, låt mig försöker läsa filen.
Så, låt mig scrolla ner.
Och nu märker det är här koden kan bli lite rörigt,
märker att jag ringer fs.readFile godkänd
i samma bana, samma callback som förra gången,
så den tidigare versionen.
Och sedan om jag skulle hitta -
om jag inte hittar det, Jag spottar ur 500.
Och om jag hittar den, vad linje ska vi se här?
Vi kommer att se fs skriva header 200 förmodligen
och en res.end sändande de faktiska uppgifterna.
Men märker detta.
Och det är inte demonstrativ av det värsta scenariot.
Men jag har denna stat samtal här än jag har lite saker.
Sen har jag en annan asynkron samtal här,
så mer indrag.
Så, bara typ av extrapolera om du kunde härifrån.
Vilka problem brukar uppstå med det språk som JavaScript
i denna miljö där du behöver inte ha returvärden
utan att du har dessa återanrop.
Och naturligtvis är detta bara en stilistisk sak det faktum
att jag håller indentering.
Men ta det här till logiskt nästa steg.
Anta att det fanns en eller två eller tre andra funktioner
som jag behövde för att utföra det var av naturen asynkron,
och därför du bara typ av hålla indrag för att hantera dem,
att hantera dem, för att hantera dem.
Du får sorts återuppringning helvete som folk kallar det
där koden börjar att få mycket brett
och ärligt talat verkligen svårt att läsa.
Som det är, jag kan typ av knappt säga att detta är en slags flöde
som har denna sorts
av stilist vinklade sak händer här.
Så detta är inte idealiskt, eftersom detta kan mycket snabbt bli
otymplig, även om två asynkrona samtal inte
en så stor sak.
Så kan vi undvika detta, eller hur?
Du kanske har skymtat att Jag misclicked en stund sedan.
I dokumentationen, du vet, det ser ut som det finns statSync.
Och statSync inte tar en callback som argument.
Det tar bara vägen eftersom det tydligen gör vad?
Den returnerar en instans av fs.stats.
Så det här kan vara din första instinkt, eller hur?
Speciellt om återkopplingsfunktioner
och asynkronitet är en lite nytt för dig, ärligt talat,
det enklaste tillvägagångssättet är förmodligen bara undvika problemet alla
tillsammans, gå tillbaka för att sortera av CS101 stil programmering
där du kallar funktionen eller metoden returnerar värdet,
kallar funktionen, returer värde,
funktionen returnerar värdet.
Och jag skulle kunna använda därför fs.statSync
som är bokstavligen samma men det är en synkron version
vilket betyder att den återgår värdet.
Det passerar inte en värderar till en återuppringning.
Men varför skulle det förmodligen vara en suboptimal lösning att tillgripa
till synkrona funktioner?
Yeah?
[Ohörbart Anmärkning]
Exakt, tar det lång tid.
Du bara saktar allt ner.
Eftersom ungefär som Shake Shack eller Tasty Burger, om de gjorde sig
av dessa buzzers och gjort dig, kunden står vid den främre
av linjen tills maten är klar innan ens ta ordern
om personen bakom du uppenbarligen
genom put saktar ner.
Folk börjar lämna, du slags rita paket.
Du kan göra ett antal av analogier här.
Men kort sagt, det är förmodligen inte en bra sak
i affärer eller för servern.
Så asynkron kod är typiskt bra åtminstone
i det här fallet, men det definitivt börjar orsaka ångest.
Och i själva verket vågar jag säga när först skriva det här,
Det tar en liten lite tid att vänja sig.
Så, låt oss börja att utrusta du med vissa bibliotek
och metoder för att göra det lite lättare.
Så, en av de vanligaste biblioteken är populära bibliotek
dessa dagar, denna en som heter async.js.
Och som många node.js bibliotek eller moduler,
alla dessa är öppen källkod.
De nästan alla lever och få nav förråd som är snäll
för att bli de facto plats att förvara dessa saker.
Och så finns det en hela infrastrukturen
för installation av dessa saker kallas NPM, Node Package Manager
som om du är bekant med EvanTube är snäll
av liknande app eller app får.
Om du är bekant med Red Hat och Fedora
som i den apparat, det är som yum.
Men det är en nod - det är en pakethanterare bara
för denna speciella miljö.
Så, kan vi hämta och installera saker som async biblioteket
och även en annan man som kallas streck biblioteket eller modulen.
Men dessa så långt fs, HTTP, stig,
de är alla kommit inbyggd i noden.
Så om vi går till API-dokumentation, du faktiskt se att byggas
till nod får du gratis en hel massa moduler.
Men massor av trevliga människor på Internet har gjort tiotals
om inte hundratals av andra bibliotek
att göra saker bättre eller annat sätt.
Så, låt oss ta en titt på hur biblioteket fungerar.
Så, de flesta av denna kod är identisk för ögonblicket.
Jag har en väg att skapat upp överst.
Och nu är jag ringer async.series.
Så async bibliotek, är det bara ett bibliotek som gör att du
att passera eller höja typiskt av funktioner för att få kallas en
efter den andra bara för slags undvika att indrag frågan,
och egentligen bara den mentala ångest som alltid kommer att uppstå
åtminstone när du först dyka in i detta på egen hand
med programmering asynkront.
Liksom åt sidan, om du har tagit 161 och du har behandlats med lås
och höja förhållanden och all av det, asynkron kod
och en miljö som node.js är faktiskt mycket,
mycket enklare utan tvekan
än att faktiskt skriva flertrådiga kod.
När som helst du har flertrådiga kod,
du har stigortsförhållanden.
Du behöver oroa två trådar som innehåller
om samma resurser disk eller minne.
Skönheten i JavaScript
i node.js är att det finns bokstavligen bara en tråd,
vilket innebär att webbläsaren
eller servern endast kan göra en sak på en gång.
Det är bara upp till dig, programmeraren
att hålla en mental modell för hur du sorterar av kö saker
och räkna ut hur för att beställa din kod.
Men du behöver aldrig oroa dig omkring höja förhållanden
på riktigt samma sätt vid minst med Raw koden så här.
Så det är en liten svårt att grack här.
Men - Så låt mig öppna upp docs för bara ett ögonblick.
Den async.js bibliotek som på liknande sätt är mycket googleable,
den lever i GitHub plantera ut som en hel del av dem.
Tror inte att det är knapphändig, det är inte.
Låt mig scrolla ner till Read Me här.
Så, async biblioteket ger en hel drös
metoder inne i det.
Till exempel, det finns en metod som kallas för varje,
som om jag klickar på detta bara att se sina docs för ett ögonblick,
detta är en funktion eller metod som tillåter dig att göra något
som en fyra vardera men parallellt.
De är alla kommer att hända potentiellt parallellt.
Och metoden vardera är endast kommer att gå tillbaka till dig när allt
av iterationerna är fullständiga.
Så kanske de händer en efter den andra.
Helst de händer väsentligen parallellt.
Men metoden inte ringa tillbaka.
Det behöver inte surra din summern tills allt
av de element som du har itereras över har avslutat.
Så det är bara ett trevligt sätt
av att undvika att använda en enkel fyra slinga
men faktiskt gör något asynkront.
Men nu mer direkt relaterade till detta exempel,
märker att det är det här serie metod.
Och låt mig bara dra upp en enkelt kanoniska exempel.
Så den asynkrona bibliotek, serie Metoden tar in som underförstådda
av hakparenteserna i arrayen.
Vilka är de uppgifter typer av elementen
i denna samling baserad på ett enkelt exempel?
Detta är en uppsättning av funktioner.
Så i C, skulle du kalla dem fungerar pekare.
I JavaScript, det finns fler korrekt refererar till funktioner
eller anonyma funktioner.
Och detta bara innebär, arrayer
naturligtvis beställs från noll upp.
Så, de har upprätthållit en ordning som är bra
för en serie, för serie naturligtvis medel göra något
i syfte att inte parallellt.
Så, detta bara innebär att denna Funktionen kommer att bli avrättade,
då den här, då detta en, den här, då den här,
Men många det finns
tills slutligen den valfria callback anropas.
Så märker paradigm här.
Och även om detta är en kille bibliotek,
det är representativt för den mycket vanliga JavaScript-paradigm
av igen med återbesök.
Så, märke till vad du gör här.
I den första funktionen är gått in via denna samling,
du definierat en anonym Funktionen bara med funktion.
Men märker att tydligen Enligt denna dokumentation,
som anonym funktion bör ta ett argument återuppringning.
Det kommer att vara en pekare eller en referens till en funktion
att du ska ringa när kod är redo att returnera ett värde.
Så återigen, till skillnad från för bara vanligtvis procedurprogrammering
där du är van vid omedelbart åter värden
att en skillnad med med hjälp av ett bibliotek som detta
i asynkron programmering mer allmänhet, är när du är redo
för att returnera ett värde från en databas från en fil,
från en aritmetisk uttryck, det är upp till dig
ringa callback-funktionen.
Och det fina om detta bibliotek
Om vi ​​läser docs mer noggrant är att,
om och endast om alla det återbesök område som kallas
utan ett fel objekt, kommer det hela att lyckas?
Så med andra ord, om det finns 2,
om det finns 10 anonym funktioner
i denna samling därför i denna serie,
endast om alla av dem lyckas,
kommer den sista valfria återuppringning anses vara framgångsrik?
Om någon av dem misslyckas, varje funktion
efter det kommer inte även verkställas.
Så det är ett trevligt sätt att sortera av att ha en kedjekoppling
som avbryter i förtid om något går fel.
Så för att se det i sitt sammanhang, här är hur vi kan åter genomföra
det tidigare programmet.
Jag får den väg som tidigare, så detta är den enkla biten.
Jag kopierar detta skelett klistra in koden
från den dokumentation som finns async.series vänsterparentes,
öppna hakparentes.
Och nu märker jag en funktion i denna början
av en sekund, vi får se där vi går från det här.
Och nu märker, det är en lite komplicerat vid första
men fokuserar bara på den rad för rad.
Fs.stat innebär få statistiken eller vad inte av denna väg.
Kalla detta återuppringning när du är klar.
Denna kod är densamma som tidigare.
Om det finns ett fel, det finns en skillnad nu.
Återigen, den mycket vanliga paradigm i node.js programmering är
om något går fel och en återuppringning behöver veta
att genom konventionen, den första argument till en callback går
inte finnas någon, om allt är bra eller en hänvisning till ett fel objekt,
huvudstad E. Det är som ett fel klass som existerar globalt
men mer om det en annan gång.
Så genom att göra detta, om det finns en fel, vad är innebörden?
Väl baserat på vad jag sade serien gör,
är om något går fel, vi bara typ av vill
att avbryta hela serien av anonym funktionsanrop.
Så räcker det för mig att bara tillbaka återuppringning passerande
på Error-objektet.
För om stat gav mig tillbaka ett fel,
Jag skulle kunna skapa en ny Fel föremål för min egen,
men jag bryr mig egentligen inte till,
Jag vill bara passera oavsett fel är det faktiskt hända
så jag kan ge det till detta återuppringning.
Och bara för att vara tydlig, det Avkastningen är inte absolut nödvändigt.
Jag vill i huvudsak att göra detta men jag ville nu göra "tillbaka;
/ / Så att inte mer koden här utför ".
Så återigen en annan vanlig konvent i JavaScript,
även om du inte är returnera ett värde i sig,
du vill passera värdet till återanropsfunktion
men då du vill att stoppa exekvering
av den funktion du i, det triviala sätt
att göra detta är just att ringa tillbaka hit.
Men det är inget fel,
Vi gör bara retur återuppringning fel även om det kommer
att återvända i odefinierat värde.
Okej, gör detta inte returnera ett värde troligen.
Allt jag bryr mig om är en ombordstigning vidare genomförande.
Så, min sammansmältning av dessa två rader är bara en stylist
till konventionen bara för att har antalet linjen
av koden jag skrev precis från 2 till 1.
Så vad mer?
Om det inte finns ett fel -
faktiskt att vara tydlig Jag skulle också undvika
att genom att göra om annat.
Men återigen, en annan gemensamt paradigm är check
för dina misstag där uppe och sedan bara tillbaka snarare än att fortsätta
indentera din kod med elses och elses och annans.
Så om det inte är en fil, nu vet ni,
Jag vill hantera detta lite speciellt.
Så här som i Java eller C + + eller några andra språk,
här är hur kan initiera en invända att skriva fel passerar
i ett standardmeddelande om inte en fil
och detta är bara något godtycklig.
Men jag signalering ett fel på min egen.
Och vad betyder denna sista linje förmodligen beteckna?
Allt är bra.
Om du skickar in null för fel parameter, som bara betyda
enligt praxis allt är bra.
Så, betyder att det händer logiskt?
Om null leds till återuppringning
som innebär den anonyma funktion har lyckats
så att säga.
Så, vad ska serien Metoden kommer före och nu behöver grundas
på min verbala definition tidigare?
[Ohörbart Anmärkning]
Gå vidare till nästa, eller hur?
Om det hade återvänt en icke-null värde, skulle det bara avbryta
och inte mer anonym funktion skulle få kallas.
Men eftersom det inte har gjorts, detta kommer att få kallas nästa.
Så, är logiken i här ungefär samma som tidigare
och vi får se hur man rengör detta upp ytterligare i ett ögonblick.
Jag inser att detta är lite av en hel del
att absorbera allt verbalt och visuellt.
Men nu märker, den andra anonym funktion som jag vill ha
att köra i serien är att försöka läsa filen.
Kalla detta återuppringning när du är redo.
Om det finns ett fel, bara signalera den med hjälp av återuppringning
så att resten av det här avbryts.
Else retur null.
Men varför är jag passerar i två argument?
Tja denna tid om jag läser filen och komma tillbaka
som en variabel som kallas data,
Jag vill inte bara betyda allt är bra genom att returnera null
för det första argumentet.
Jag vill returnera den verkliga uppgifter som det andra argumentet.
För om jag läser vidare i dokumentationen,
märker denna sista bit av kod hakparentes innebär att det är den
slutet av serien.
Det fanns bara två anonyma funktionerna i den här serien.
Om det fanns ett fel här, då Jag vet att en av länkarna
i denna kedja så tala misslyckades.
Så med andra ord, detta fel kommer att bli ett Error-objektet
som är noll om någon av dessa killar misslyckades.
Och om så är fallet, jag är bara kommer att lösa ut och jag ska
säga 400 som innebär begäran misslyckas,
det är väldigt generiska felmeddelande.
Och då, kommer jag att skriva ut felmeddelandet.
Så jag inte bry sig om att vara super anal den här gången,
Jag kommer inte att skilja mellan 500 och 404 och 403,
Jag är bara typ av blint våg min hand
och säga något gick fel.
Men om inget gick fel,
Jag kommer att skicka det här res.end passerar dessa data.
Nu ser lite kryptiskt.
Men återigen, om jag läser dokumentationen,
det andra argumentet till denna sista, sista återuppringning,
killen som bara är verk gång serien görs
verkställande eller en del där av, kommer detta att vara en array
av alla de andra argument
som antogs på återuppringning.
Nu visar det sig att den bara länka i den här serien
att faktiskt återvända till andra Argumentet är detta en här.
Så jag ska sortera om på en steg i tro använder helt enkelt förmodar
för det ögonblick då förra är en metod
som ger dig det senaste element i en array.
Eftersom denna matris som är som passerade
för mig har två indicies, noll och ett.
Det är bara noll har inget värde eftersom den här killen tillbaka -
inte passerar i en andra argument men den här killen gör.
Så resulterar bygel noll är ingenting,
Resultaten bygel en innehåller vad,
Om du har följt tillsammans fram till denna punkt?
Filen är hej, värld innehåll förmodligen,
så det är hur jag faktiskt skriva ut den.
Och låt mig avsluta en detalj här.
Om jag gör den här typen av gamla skola, om jag vill få
på de sista delarna, om jag kunde göra resultaten [results.length-1],
det är typ av gamla skolan
att få tillgång till de sista elementen in - eller nollindexmatrisen.
Men som i sidan, minns att jag hade detta bibliotek
här uppe streck som genom konvention är bara kallas
bokstavligen ett understreck karaktär som inte är speciell,
det bara ser coolt ut dollartecken gör för jQuery.
Detta är bara en hjälpare Förfarande streck dot sista
som gör exakt samma sak.
Och om du aldrig har använt det innan streck JS både
för klientsidan kodning
och serversidan är en underbart användbar bibliotek
att så många människor som beskrivs det gillar jQuery innehåller alla
av de metoder som folk ville kom med JavaScript själv.
OK.
>> Så, som ganska till mig och Jag tittade i serien,
du har som återuppringning som ett argument?
>> Ja.
>> Som så när du faktiskt som push som in,
och gillar det som gör det menar när man bara har
som återuppringning och gör sedan som -
[Ohörbart Anmärkning]
>> OK, bra fråga.
Så, låt mig dra upp async huvudsakliga sida här
eller dokumentationen på GetHub.
Så detta är den kanoniska struktur.
Om du samtal med hjälp av detta viss metod serien,
det finns två stora delar till den.
En är en matris av anonyma funktioner
och två är en slutlig återuppringning funktion som faktiskt
utförs på mycket slutet av serien.
Om vi ​​zoomar in ett lite närmare på den första
av de stora sakerna, de rad anonyma funktioner
genom krav på detta guy dokumentation har
att vara en anonym funktion som tar
i ett argument som heter återuppringning eller foo eller bar, det spelar ingen roll
men han kallar det återuppringning.
Och detta är en slags din summer att Shake Shack händer dig.
Detta är det sätt på vilket Du kan returnera ett värde
till kunden eftersom du kan inte bara göra bokstavligen tillbaka.
Du måste göra det genom vägen för detta återuppringning.
För om insidan av detta Funktionen är lite långsam löpning
kod som frågedatabasen, läsa filen från filsystemet,
du inte vill vänta där och blockera alla andra,
du vill ringa återuppringning.
Så, är det bokstavligt talat namnet av argumentet.
Men som i C, du har funktionspekare.
I Java har du referenssystem metoder
och samma sak här i JavaScript.
Detta är en variabel men dess typ är funktion.
Så helt enkelt genom att skriva sitt namn om en återuppringning eller foo
eller bar, då vänsterparentes och avslutande parentes,
du utför det på denna funktion.
Och passerar en null som innebär null felet och en
vilket innebär att detta är den uppgifter som jag vill gå i.
Och sedan bit för att vara tydlig, detta är en annan återuppringning.
Och det är inte kallad callback,
det bara konceptuellt är en callback-metoden funktion
eftersom det kallas per definition
av denna skribent bibliotek när hela serien har avslutats
eller delar av ett set om en fel har hänt förr.
Så, namn på callback-funktion, ringer callback-funktion,
namnet på callback-funktion, ringer callback-funktion,
annorlunda återuppringning fungera tillsammans.
>> Vi har nu som definiera återuppringning?
>> Nej, eftersom den här killen kommer att passera in i din samling
av anonyma funktioner,
en pekare till den kod han vill köra.
Exakt, okej.
Så ska du säga att koden blir lite enklare.
Så kan det.
Och om du är som mig, ta komfort i åtminstone veta,
det tar ett tag till vänja sig vid detta.
Men vi kan rengöra detta upp lite,
inte kasta för mycket på dig men här är en annan variant
och med en annan metod
i samma bibliotek kallas vattenfall.
Fördelen med vilket till skillnad från serier där varje
av dessa anonyma funktioner exekveras väsentligen
oberoende av var och en av de andra.
Vattenfall som namnet antyder gör de översta funktionerna
till typ av pass i värden till den undre funktion,
Ungefär som en kaskad av vatten.
Så uppsidan av detta är att jag kan typ
av använda detta till min fördel.
I async.waterfall, märke till följande.
Jag kan bara ringa fs.stat passerar i banan
att jag vill få statistik över.
Och sedan minns innan jag hade en anonym funktion
som hade två argument fela,
esultat och sedan ringde jag callback-funktion manuellt?
Med andra ord är bara att vara klart, minns att tidigare
i async 2, gjorde jag allt av denna otäck arbete.
Jag ringde fs.stat gått i P,
förklarade min egen anonym funktion.
Jag kollade då om felet är inte null sedan gjorde jag detta,
annars gjorde jag det, hela skönheten i följande konventioner
som i node.js är att återuppringning funktioner i allmänhet är avsedda
att ta minst ett argument, Ett fel objekt följt av noll
eller mer användbara värden.
Så märker paradigm här,
denna callback-funktion är jag förklara följer exakt
paradigm som den här killen async biblioteket gör.
Vilket är att säga detta, varför är Jag genomföra min egen återuppringning
metod då författaren till denna Biblioteket är bokstavligen lämna mig
på ett fat så att säga, en callback-funktion jag kan använda?
Så jag kan bara passera i referera han har gett mig
så att omedelbart, min flera linjer
av kod blir en rad kod.
Nu, vad gör vi med det här?
Nästa funktion som Jag vill köra,
nästa anonym funktion i denna matris
funktioner gör följande.
Observera först stat är det första argumentet.
Så något har ändrats redan.
Nu, den här killen som skrev biblioteket -
och jag säger kille eftersom det är en man.
Den här killen som skrev detta bibliotek är dokumentation garantier
att om denna funktion här skickar mig tillbaka ett fel objekt
eller noll följt av koma separerad lista av andra värden,
Han kommer att se till att de som andra värden är handed
till den anonyma funktionen i ordning från vänster till höger.
Och vad som brukade vara bara en callback-funktion ensam helt enkelt
blir den sista sådant argument.
Nu vet jag inte vem jag är med fokus på bara du vet.
Men nu, vad är det ta bort här?
Så, vi vet från dokumentationen
eller den kända par exempel
att fs.stat ultimately förväntar en återuppringning med två argument,
Error-objektet, som är en Fel objekt eller null följt
med en hänvisning till statistik invända.
Så om jag tänker på det, Fel objekt koma statistik invända,
som passar i paradigmet av denna persons bibliotek.
Så, jag kan bara säga eftersom Jag NEJ det andra argumentet
att det är - det händer som skall passera genom fs.stat
till återuppringning är err, statistik genom definitionen av detta bibliotek,
Jag kan sätta den andra Argumentet namn här
eller vad jag kan byta namn på den
Om jag vill ha följt genom återuppringning här.
Så kan jag skicka en värderar härifrån till hit.
Nu, allt detta nummer även om visserligen något kryptiska är
åtminstone kopiera klistra för största delen från tidigare.
Den enda skillnaden är Grafiska här jag förklara ett fel
invändningar och nu vill jag för att få en lite snyggare.
Jag vill verkligen veta vad felet var, så jag ska
att stoppa insidan av detta objekt en egendom godtyckligt kallas kod
så att jag vet att detta är inte en fil
som borde vara obehörig, det är en HTTP 403.
Låt mig komma ihåg att innan Jag passerar Error-objektet
på återuppringning.
Och sedan slutligen försöka läsa filen, så att i detta fall,
vattenfallet, har jag brutit koden från två stora steg
in i tre mindre steg.
Lägg märke till skönheten här,
Jag kan ringa fs.readFile passerar i sökvägen.
Och sedan det svåra mentalt är jag passerar bara
i killens återuppringning.
Saken han gav mig, jag är kommer att passera till fs.readFile.
Eftersom vi alla ansluter sig till samma konventioner,
första argumentet till en callback är Ett fel objekt eller null följt
av koma eller separerad lista med användbara saker.
Så, vad det betyder nu och om jag Läs den dokumentation jag vet
denna, den allra sista återuppringning, den här killen här utanför
av hakparenteserna går som ska skickas på fel objekt
eller null som jag ska kolla efter som alltid med denna kod här.
Och då per definition med denna metod
i killens dokumentation, det sista värdet som returneras
från den sista metoden i min anonym samling -
min samling av anonyma funktioner.
Så, vad läser filen avkastning
och jag använder en avkastning löst nu.
Jag menar vad läser fil passera som argument
till callback-metoden dess hänt?
Två argument, är först Ett fel objekt eller null,
det är nästan alltid kommer att vara svaret.
Och den andra saken går vara det för läs-fil?
Innehållet i filen, uppgifter som vi kallade det tidigare.
Så, genom att helt enkelt förklara fela, resultat,
och kontrollera om fel här är slags tråkigt nu.
Annars gör jag res.end passerar i detta resultat.
Detta kommer utan tvekan inte synkronisera in perfekt
tills du faktiskt skriva det själv.
Men för nu, ta bort åtminstone det faktum
att det tydligen här gemensamt paradigm, där om vi
och författare av bibliotek all slags pinne
med denna konvention av återkopplingsmetoderna.
Och det första argumentet är Ett fel objekt eller null.
Och den andra och tredje
och fjärde objekt är saker vi bryr oss om och vi sorterar
av att följa regler och dokumentation.
Vi började med kod som ärligt är ganska ful.
Och även om den senaste exempel är ärligt talat ganska svårt
att linda ditt sinne runt, det är åtminstone visuellt,
ser ut som det är mycket hårdare.
Och när du får bekväm med det, det är så mycket lättare
och det är så mycket mindre benägna att buggar än tidigare exempel.
Så, låt mig demonstrera en sista sak här.
Detta är version tre.
Och - Nej, låt oss lämna detta en ensam.
Låt mig gå in i ett par andra sista saker som teasers.
Okej, så i server 2.
OK. Först några frågor, Jag vet att detta är en mycket
men du ville ha mer instruktioner, så?
Du sa inte bra instruktion nödvändigtvis.
Yeah?
[Ohörbart Anmärkning]
Korrekt, du är i huvudsak överseende för operativsystem
för att lista ut hur man jonglerar alla dessa bollar på en gång,
läsning från en fil, läsa från en databas.
Och det är här JavaScript-server själv som är enda gängade.
Och i grunden och faktiskt,
det finns en bild Jag ville inte kasta upp,
och det är inte nödvändigtvis allt som upplysande
men kanske vi ska ge du en mental modell.
JavaScript själv och noden
i synnerhet har denna så kallad händelse slinga.
Varigenom, kan du tänka av node.js, programmet,
är bokstavligen som en oändlig loop.
Det är bara en vild slinga, väntar och väntar och väntar,
söker uppgifter att slutföra.
Och den uppgiften kan vara, gå hämta något från en databas
eller här är ett värde från databas eller hämta den här filen
från disk eller här är en begäran från en användare.
Någon form av händelse, precis som den webbläsare händelsestyrd,
så som server sidohändelsestyrd.
Och några av dessa saker utgör händelser.
Så någon i node.js, precis skrev en oändlig slinga,
en stor vild slinga, väntar efter saker att hända.
Och som saker händer, det hamnar i en kö, eller hur?
Förvisso en databas kan returnera ett värde.
Och ett filsystem, drift Systemet kan returnera ett värde
vid ungefär samma tidpunkt men det kommer förmodligen
vara någon beställning till dem.
Och node.js kommer att har väsentligen en kö
som en stor matris eller en vektor, vissa datastruktur
som buffrar alla av dessa saker.
Eftersom det kan bokstavligen bara hantera en av dem i taget.
Så när du, utvecklaren,
skriva asynkron JavaScript kod med asynkron
funktion, du tillåter detta så kallade händelse slinga för att gå
till nästa fästingen, eller hur?
Så länge du omedelbart tillbaka som alla
av dessa asynkrona metoder gillar läsa filen och stat,
de omedelbart återvända eftersom återuppringning till slut
kommer tillbaka.
Så fort du kommer tillbaka,
det betyder att någon annan kan få dök upp beståndet här
eller att det kan bli poppade upp framför den kö här.
Och så finns det i faktum serialisering
av allt som händer,
även om alla dessa saker kan hända parallellt
På en flertrådssystem.
Men node.js själv och servern kördes
som en tråd.
Och den negativa sidan av det är t du inte nödvändigtvis max
ut datorns förmåga är så speciellt
om du har en 16 kärna eller även en 2 core dator
och du bara kör en instans av nod.
Men om du har en gång tagit något liknande 161,
du undvika en stor mardröm av huvudvärk när det gäller
ras villkor och lås och semafor
och skriver verkligen flertrådiga kod,
så upsides och nackdelar.
OK. Så, tillbaka till koden här, Låt mig föreslå att vi börjar
att förenkla saker och ting lite.
Vi såg server en lite sedan som såg ut så här.
Så, det är utan tvekan ganska enkel.
Men precis som i världen PHP, det finns ramar
som Laravel och det finns saker som Rails och Django,
Samma sak i node.js världen.
Och vi kommer att spendera mer tid på detta på onsdag
och i nästa projekt.
Men om jag går in i en server 2 katalog,
märker ett par paradigm här.
Så det här är - det går för att vara ett ekvivalent exempel
men det är med hjälp av en ram kallas express.js,
som är fri öppen källkod program som Rails och Django,
som Laravel, det är bara i slutändan kommer
vara föga uppskattad idag För vi har skrivit
sådana enkla exempel.
Men lita på oss.
Detta kommer mycket snabbt bli din vän
eftersom det kommer att spara dig mycket TDS-kod.
Och en gemensam paradigm för en express.js ansökan
att ha en app.js eller server.js fil som innehåller den logiska
av ditt program eller på minst inkörsporten.
Du kan ha flera filer.
En nod modulkatalogen vilken har biblioteken
att du har hämtat liknande async
och uttrycka sig själv i andra.
Och sedan package.json, package.json ser ut så här,
och du kan skapa den manuellt eller verktyg som skapar det för dig
och det är bokstavligen en json-fil
och den intressanta delen är beroenden här.
Precis som i Laravel, du hade som leverantör katalog
och du var tvungen att oroa om paket och gör -
faktiskt uppdateras med Artisan eller liknande kommandon,
biblioteken dig har installerat,
på liknande sätt med package.json här och du hantera biblioteken
och versioner att du bryr dig om.
Så, om jag har en package.json, Jag kan helt enkelt göra NPM,
Node Package Manger installera, det kommer att automatiskt söka
vid denna package.json fil.
Titta och se, det gör jag har den senaste versionen
av alla leverantörer moduler
i en nod streck moduler katalogen här eller kanske
i någon förälder eller förfader katalog.
Och om inte, är det ska ladda ner dem
och du kommer att se en hel drös
av HTTP grejer går tvärs över viran.
Så till exempel, låt mig visa innehållet
nod moduler bara uttrycka.
Låt mig gå vidare och fett radera nod moduler
så att allt jag har nu är den här.
Och om jag NPM installerar, kommer du se till att det kommer att läsa
att package.json fil och vi har sett utgång liknande
till detta vid Laravel världen.
Den laddar ner en hel massa saker och det är
eftersom uttrycklig i sin tur beror på en hel massa
av andras bibliotek.
Så, alla som är typ av laddas ned rekursivt.
Fram till nu, om jag gör i LS igen,
Där är min nod moduler katalog tillbaka
och uttrycka som back.
Så det är bara ett sätt att förenkla pakethantering.
Nu, om vi tittar på den app.js fil, kommer detta
vara en återgång till vår tidigaste webbserver
där vi bara spotta ut "Hej, världen".
Men märker paradigm här,
först behöver vi uttryck modul, då har vi denna linje
av kod som du vet från dokumentationen.
Du bokstavligen behandla det modulens variabel som en funktion,
så öppen parentes nära parentes betyder verkställa det.
Det kommer att tydligen returnera något vi ska
vanligen kallar en app.
Hur fungerar det?
Jag vet inte riktigt.
Jag ska låta någon annan, du vet, i det uttryckliga världen skriva det.
Jag ska nu stå på hans eller hennes axlar så
att göra min ansökan kör lite enklare.
Här kommer jag att lyssna på just den port
som kan vara de flesta någonting.
Och här är koden som är kanske mer påminner nu
av Laravel och routes.php.
Så det här är kvällsmat enkel, jag är bara att ange en rutt
för snedstreck stjärna, så allt kommer att absorberas
av denna begäran hanteraren.
Det paradigm för begäran handler är dess anonym funktion
med en begäran om argument
och en svarsobjektet precis som tidigare.
Och res.send i express medel du skicka koden följs
med vad du vill skicka.
Och naturligtvis kan du göra något snyggare
genom att faktiskt skicka filer eller HTML
eller dynamiskt genererade innehåll.
Men för nu, allt vi gjorde var spotta ut hej, värld.
Om vi ​​går in i servern tre, detta är ännu finare bara
visa viss funktionalitet.
Och vi ska visa dig ett ännu sexigare version
av detta på onsdag.
Men om du någonsin har hört av Socket IO kanske,
så jag tror Jonathan eller någon sa tidigare,
en av de saker nod är riktigt känd
för är dess realtid beteende, eller hur?
Tänk PHP i MySQL, om du skulle genomföra en chattserver
i PHP där två personer kunde Öppna ett webbläsarfönster till foo.com
och sedan börja IMing varje andra, Alice i ett fönster,
Bob i en annan, så att var och en av dem ser sin
eller hennes meddelanden i det andra fönstret.
Hur skulle du göra det här i PHP och MySQL?
Att använda eller inte använda Laravel sort av immateriell, kan du ha
som en index.php.
Och du måste ha - i vissa fall det måste spotta
ur formen, så det finns kommer att vara ett HTML-formulär
som förmodligen lämnar inte via normal formulär
men Ajax nog, eller hur?
Så, en på skicka handler, så du skriver i ett textfält,
du trycka Enter och sedan blir det skickas till servern via Ajax.
Vad gör du då göra på servern?
Så, har du fått index.php
eller något dot PHP som är emot i HTTP-parameter
från användaren, Alice och Bob snabbmeddelande, vad gör du
med den för att propagera den Bob och Alice, respektive?
Jag menar du bokstavligen har verktygen med vilka
att göra detta i din min.
Så som vad skulle du göra?
Du har en minut till genomföra detta program.
Yeah?
[Ohörbart Anmärkning]
Perfect. Rätt, så du har en databas.
Vi vet lite lite om MySQL.
Så, har du en tabell det är meddelanden,
kanske det finns en gånger stämpel, ett användar-ID,
kroppen av meddelandet själv skapat det,
uppdaterat det och allt detta.
Så, du lagrar i en databas.
Och antar att Alice sänder första budskap, hur Bob får
det budskapet nu från databasen?
>> Det kan finnas vissa Ajax svar som ständigt händer
tillbaka till databasen top få [ohörbart].
>> Exakt.
Så Bobs kod som är kod är samma som Alice är bara typ
av ett symmetriskt förhållande,
Bob webbläsare har vissa Ajax-kod det är nog kanske var 30
sekunder drar den server via Ajax synk,
finns nya meddelanden?
Finns det nya meddelanden?
Varje 30 sekunder kommer att vara typ av suboptimal
eftersom han måste vänta ännu
om Alice rally precis skickat meddelandet.
Så, Bob webbläsare kan varje sekund slog servern.
Men det betyder Alices webbläsaren slår servern
varje sekund.
Hur är det med Charlie [Antas stavning]
och David [antas stavning] och Edward [antas stavning]
och varje annan bokstav i alfabetet?
Vad är problemet av denna strategi?
Många träffar alltför stora -
Jag menar att du är bara effektivt Dosering din egen syn
eller DDOSing, Distributed DOS-attack
på din egen webbplats, genom att ha alla
av dessa användare köra JavaScript kod som bara pinga
fan av din server även om godtyckligt antal,
80 procent av tiden ingen har sagt något
i chattrummet.
Men du bara kontrollera för att försäkra om en sådan.
Så PHP i en hel del språk är inte bra
för realtidskommunikation.
För i PHP minns det finns ingen central minne, eller hur?
Du har sessionsobjekt som skapar en illusion
för central lagring, men det är på en per användare.
Du har inte den globala minne som du gör i en Java Servlet
i bekanta eller i andra ram fungerar så.
Node.js fast, har du globalt minne för du har
en server och att "kan ihåg något den vill
om alla användare.
Och du kan fortfarande har en databas.
Men det fina med node.js också är att det är mycket bättre
än något som PHP och skapa en illusion
hantera flera saker samtidigt.
Och i själva verket som i åt sidan, kan du implementera chattservrar i PHP,
men du normalt skulle göra något som kallas long polling
där du inte pinga servern varje sekund.
Du pinga servern, servern svarar inte på dig
för drygt 30 sekunder, bokstavligen sitter det
i en slinga väntar och väntar.
Och servern kontrollerar om det finns nya data i databasen
och bara en gång det du ser, "Åh, här är ett meddelande från Bob, "
betyder svara på HTP-servern?
Så effekten i din webbläsare är att ikonen IE eller Mozilla
eller vad bara håller spinning för 30 sekunder i taget.
Men uppåtsidan är, att du inte har 30 anslutningsförfrågningar
i 30 sekunder, har du en.
Så det kallas lång polling.
Men ännu bättre i modern webb webbläsare är något som kallas
WebSocket, vilket du tar CS143,
du kan faktiskt göra en TCP-anslutning från en uppdragsgivare
som en webbläsare till en server och sedan hänga på det
utan att använda nästan så många resurser
som HTTP kanske traditionellt gör.
Och Socket IO är en node.js bibliotek
som gör det mycket lättare att göra anslutningarna socket
eller illusioner där på för gamla webbläsare
så att du kan genomföra detta realtidsfunktionalitet talet.
Så, här är ett exempel.
Detta stoppar upp topp får en lite mer komplicerat
men det är mestadels kopiera och klistra från socket.io s dokumentation.
Här finns nu en mer exakt begäran handler.
Om användaren begäran om en slash, vilken fil ska jag
vara tydligen tjäna upp till dem?
Index.html.
Och det finns en del nya grejer här ström
som jag ska visa dig på bara ett ögonblick.
Men detta är bara ett annat sätt
för gripa tag i en fil en lite mer effektivt
än att bara göra fs.readFile.
Det är lite smartare särskilt för stora filer.
Så lång historia kort, dessa linjer bara för att tjäna
upp en fil som heter index.html
vilket för nu antar innehåller HTML-form genom vilken Alice
och Bob kan KOMMUNICERA.
Slutligen io.sockets.on, så detta kommer från denna linje här uppe.
Så, jag bara läser dokumentation io.socket ger mig
tillgång till en så kallad WebSocket med en webbläsare,
mellan webbläsaren och servern.
Jag lyssnar för speciella händelse anslutning som medel
när användaren först träffar servern försöker
att öppna detta sammanhang är jag kommer att kalla detta samtal tillbaka.
Och nu kommer jag att göra följande.
Var femte sekund, vad jag ska göra?
Jag ska släppa ut eller sända om du kommer ihåg scratch,
det grafiska språket skulle att ett sändningsblock?
Så, du kommer att avge
eller utlösa en händelse som kallas godtyckligt från servern.
Och det kommer att innehålla ett meddelande Ping
och det aktuella datumet.
Så detta är en verklig chatt-server att Alice
och Bob kan använda, men det är typ av en automatiserad chattserver
där meddelandena är bara typ av sonar ping.
Det är bara datum på tider som är skickas var femte sekund.
Så, om jag verkligen köra den här sak - och det är det.
För att vara tydlig här nere, meddelande det är bara att logga här nere.
Så låt mig slå ett blunda för det.
Låt mig göra nod av app.js.
Låt mig gå i min webbläsare.
Ladda om hemsidan här.
[Paus]
Och låt mig avsluta inspektören.
Var femte sekund, jag har en demonstration, även om inte
interaktiv för mänsklig
av något som är sker asynkront.
I webbläsaren varsel, det finns ingen snurrande ikon.
Det är med hjälp av en avancerad funktion av Chrome i moderna webbläsare
för att upprätthålla en hylsa anslutning under huven
och det är vad som kallas allmänhet en pub / sub-modellen,
publicerings / prenumerationsmodell där vi inte har gjort
som ganska tydligt här.
Men vad är trevligt om det här allmän pub / sub paradigmet är
att man kan ha en förläggare.
I detta fall är central server och alla
av den individuella webbläsare är kunder.
Alices och Bobs av världen kan prenumerera på det,
så att du kan förmedla meddelanden bland ett antal användare.
Och även om igen att vi är inte ser interaktivitet,
Vi hade kanske 12 rader av koden bara för att göra detta.
Och det är nog inte ett språng att föreställa sig hur man skulle piska
ut filen index.html som har en sann HTML-formulär,
lite jQuery-kod med Ajax som inte skickar en dagtid
men bara skickar vad Alice eller Bob typen till servern
och sedan servern kommer att vidarebefordra det.
Och jag lovar att skymta på en sista sak bara
att reta dig med detta.
Om vi ​​går in i bäck noll och ett,
ser du kod som bara lite annorlunda här.
Bara så att du har sett det, detta är ett alternativ
vad jag kallade fs.readFile metod tidigare, varvid,
du kan berätta node.js, "Go Läs den här filen i minnet.
Men om det är stort bara ge mig en bit i taget. "
Och du kanske vet från CS165
eller 161 filsystemen har olika
prestandaegenskaper.
Du kanske vill läsa i block om 512 byte
eller 2 kilobyte eller vad som helst.
Detta är ett optimerings sätt att komma tillbaka i filen iterativt
så att du kan spotta ut lite snabbare
till webbläsaren eller vem slutkunden är.
Så stor mängd innehåll i dag och vi kommer att dyka
in mer i detalj på onsdag med Tim [antas stavning]
särskilt titta på hur vi kan översätta några av de idéer
från den första halvan av Naturligtvis Laravel och modeller
in i ett bibliotek som han själv skrev kallad Bookshelf.js
som blivit allt populär i samhället
eftersom det ger dig det mesta av det,
om inte mer än den funktionaliteten hos talande
som minns är att bibliotek inblick i Laravel,
så mer om det och mer hur
att utveckla fullt utvecklad appar på onsdag.
Vi ser du då.