KEVIN SCHMID: Hei alle sammen. Velkommen til CS50 seminar på node.js. Mitt navn er Kevin. Jeg er en CS50 TF. Og jeg er liksom som virkelig spent om dette seminaret. Jeg tror Node.js er veldig kul. Jeg håper at dette seminaret kan brukes som en god, antar jeg, springbrett for noen av dine siste prosjekter hvis du er interessert i å bruke noe som node.js. Vi skal liksom starte seminaret av ved bare snakker om en liten bit av slags bakgrunn skalerbarhet perspektiver av Node.js, og deretter vi vil flytte til noen kodeeksempler. Og jeg vil ha koden på en nettside, og du kan se på koden. Og etter seminaret, vil jeg sortere snakk om hvordan du kan sette opp Node.js på datamaskinen. OK. Så la oss komme i gang. Så jeg antar jeg vil bare snakke om webservere, egentlig, først. Og for å starte denne diskusjonen, jeg i utgangspunktet ha et diagram som utgjør fra lærebok som brukes for CS61, som utgangspunktet viser samspillet mellom en klient prosess, som din web leseren eller lignende målet klient eller noe sånt, og en web server. Så denne typen ligner på bilde som du så i foredrag om Onsdag der utgangspunktet vi har noen klient prosess som Google Chrome. Og deretter trinn en er klienten sender en forespørsel. Så det kan være noe sånt vel la oss besøke, vet jeg ikke, CS50.net. Så vi utstede at forespørselen. Og er det noen som husker navnet på protokollen som angir hvordan det anmodning bør være strukturert? Jepp. PUBLIKUM: [uhørbart]. KEVIN SCHMID: Nettopp. Så det er som HTTP, ikke sant? Så i utgangspunktet spesifikasjon for hvordan at forespørselen skal faktisk legges ut, fordi ved slutten av dagen, at anmodningen er egentlig bare liker en streng som i utgangspunktet sier jeg ønsker dette. Og spesifikasjonen for det er HTTP. Så det er som en protokoll. Så da serveren mottar at forespørselen. Så dere har en web-server installert i CS50 apparatet. Det er Apache. Og denne uken når du jobber på problemet satt sju, vil du faktisk være i arbeid med det web server. Slik at serveren mottar denne forespørselen, og så det må slags ripe sin hode og si like godt hva gjør jeg med dette? Så basert på hva den bestemmer seg for å gjøre, så det kan ha å kontakte noen form av ressursen. Og at ressursen kan være en mange forskjellige ting. For én, kan det være like som en statisk HTML-fil. Så det kan bare være som noen HTML som er som for din personlige nettside. Det kan være en statisk fil som et bilde eller som en film som du har. Det kan også ha å snakke til en slags database som en MySQL database. Så det trenger ikke alltid å kommunisere med en kilde, men noen tilfeller, det kunne. Så hva det kommer til å gjøre etter det er det kommer til å sende tilbake svar. Og responsen til dette er også spesifisert av HTTP. Så da kunden kan motta den. Det kan rive den fra hverandre og behandle den. Og så får du en nettside som Google eller CS50.net eller uansett hva du gikk til. OK? Så dette er den grunnleggende samspillet som vi kommer til å være med å gjøre. Og vi er ganske mye kommer til å være fokuserer på denne del av interaksjon, serveren. OK. Cool. Noen som har noen spørsmål så langt? OK. Så som vi sa, mottar webserveren dette HTTP-forespørsel og deretter sender denne HTTP respons. Og som vi snakket om før, CS50 apparatet webserver er Apache. Så når dere jobber på P satt syv, du kommer til å jobbe med den Apache webserver. Du trenger aldri å virkelig jobbe med Apache direkte for mye. Du liksom konfigurere Apache litt når du angir de virtuelle verter eller v verter, og vi får til at i en liten bit. Men i utgangspunktet, Apache web server satt opp til å jobbe med PHP slag av ut av boksen. Så hva som egentlig skjer er når du går til en av dine nettsteder som for eksempel lokale verten slash index.php eller noe, er nettleseren din sender som forespørsel, og deretter Apache sitter det og finner ut å gjøre med det. Og handlingen er å utføre at koden i index.php og så å sende dem tilbake. Så det er det. Så vi liksom snakket om dette. Så det kan bare tjene en statisk fil eller kjøre noen PHP-kode og deretter saken responsen. Så da et vanlig spørsmål som kan komme opp er godt, hvordan kan vi egentlig forholde med å ha flere brukere på samme tid? Så tenk deg hvis du skulle skrive en web server, hvis du hadde en webserver som du prøvde å skrive på noe som C eller noe sånt, utgangspunktet du kan tenke på hvordan det kunne være en slags kode som ville motta forespørselen, men da det har å gjøre alt dette arbeidet på den. Det kan ha å, for eksempel, kan du kontakte database eller noe sånt. Høyre? Og så ville det gjøre den slags behandling, og deretter sendes tilbake responsen. Så det er like høy oversikt nivå. Men det er ikke umiddelbart opplagt hvordan du kan gjøre det slik at to personer eller selv tusen mennesker kunne arbeide med din webserver samtidig. Så løsningen som Apache bruker kalles tråder eller prosesser. Så du har kanskje hørt om disse vilkårene før. Det er OK hvis du ikke har, men bare tror om tråder eller prosesser som måter for et operativsystem eller et brukerprogram eller noe sånt eller en web-server å slags utføre flere ting på en gang. Så du har kanskje hørt begrepet som tråder i utførelsen. Så det er litt som du er slags multitasking. Og hvis du har sett på boksen din laptop, eller noe sånt, flerkjernede, hva du kan gjøre er at du kan kjøre to forskjellige tråder på forskjellige deler av CPU slik at de kan kontakte faktisk skje på samme tid. Så dette er virkelig kraftig. Og dette er slags Apaches Løsningen på dette problemet. Så er det litt som eventuelle problemer med denne tilnærmingen skjønt? Så jeg antar jeg slags skrev dem der. Men begge slags bruker mye minne. Det er veldig dyrt å lage en tråd eller en prosess. Og en del av begrunnelsen er at bare som når du kjører et C-program som din viktigste og deretter at samtaler en annen funksjon, er det eller annen form for stabelen. Så tråder også kreve en helt separat stack som kan være ganske stor. Og hvis du kan tenke deg å ha tonnevis av brukere på nettstedet ditt, vil du ha mange forskjellige tråder. Det er mye av stabler til administrere og vedlikeholde. Så det er stor minneforbruk. Og så, også, la oss si at du bare har én CPU, eller la oss si at du har flere tråder enn du har disse multicores. Høyre? Så la oss si at du hadde 10 tråder og du bare hadde fem CPUer. Du slags nødt til å gjøre denne tingen der du veksle mellom gjeldende en som kjører fordi du kan ikke kjøre alle 10 på en gang. Og det kalles en kontekst svitsj. Og dette ordet faktisk har et par forskjellige sammenhenger, men la oss bare tenker på det som å bytte mellom to tråder. Det kan være ganske dyrt fordi innerst inne hva du trenger å gjøre er du nødt til å stoppe hva du gjør, lagre staten som kjører tråden, og deretter bytte til et annet sted. Så gjør alle slags se den motivasjon for hvorfor tråder og prosesser kan være litt klumpete? Og visste du har et spørsmål? OK. Cool. Noen som har noen spørsmål? OK. Så hvis vi tar et skritt tilbake for en andre, det er litt som en observasjon at vi kan gjøre om mye av web-applikasjoner. Og det er egentlig at mange av dem faktisk ikke gjør det mye nyttig arbeide inne i en tråd. Så har noen startet på P satt sju i det hele tatt? Så vil du kanskje beskrive noen av delene? Har du jobbet på innlogging eller noe sånt? PUBLIKUM: Nei. KEVIN SCHMID: OK. Bare hyggelig. Unnskyld. Men i utgangspunktet, i P sett, er du kommer til å være å gjøre en masse slags spørringer til en database for å få litt informasjon fra denne databasen. Og hva koden din kommer til å gjøre, hva som Apache prosess eller at Apache tråden kommer til å være å gjøre samtidig som det har til å kontakte databasen er det liksom skal være sitter der og det kommer til å være venter på databasen for å svare. Nå som kanskje ikke høres ut som så stor en håndtere fordi databasen er på din CS50 apparatet, ikke sant? Men det er en slags nettverk ventetid der fordi nå nettet serveren har å utstede sin egen forespørsel til databasen for å kommunisere med den database og deretter få det informasjon tilbake. Så nå er det like godt vente på meg, jeg er kommer til å gå få noe fra database og så er det en mye venting skjer. Betyr det fornuftig? Og for enkelte ting det er ikke så ille. Hvis det bare er å, for eksempel, access memory, som ikke liker fryktelig I / O latency. Og når jeg sier, I / O-latency, det jeg er henviser til er som en hvilken som helst type som Input Output. Men for å få tilgang til en fil på disken, som hvis jeg ønsket å tjene den statiske HTML fil som var på min nettside eller noe sånt, jeg slags nødt til å stoppe for en bit, lese denne filen i fra disken, og deretter i at prosessen Jeg venter. Jeg gjør nyttig arbeid. Dette er ikke sant av alt, men det er vanlig i programmer som P sett syv og en rekke programmer at du ikke er faktisk gjør mye tenkning. Og når jeg sier tenkning, mener jeg som beregningsarbeidet. Så beregningsarbeid kan være noe som, si, ville at du skulle skrive en web server som bare beregnet n'te Fibonacci-tall. Det høres ikke ut som en spesielt morsom web server. Som jeg ville ikke forvente at området skal være den neste Facebook, men det er en viss slags beregningsarbeidet. Og du kan tenke deg å erstatte det med en annen form for interessant beregningsorientert arbeid. La oss si at du skulle skrive noe som beregnet de grader av separasjon mellom to mennesker eller noe sånt. Så det innebærer noen form av beregningen, ikke sant? Og selv da, for å gjøre at du fortsatt har å gjøre mye venting for kanskje du må spørre en database for å se opp hvem som er venner med hvem eller noe sånt. Så det er den slags forestilling av beregningsarbeidet. Betyr det fornuftig? Er det noen som har noen spørsmål? Oh, og jeg tror jeg satt chat-servere der fordi chat servere er slags et annet godt eksempel på dette. En chat-serveren har ikke å gjøre mye tenking. Det har bare å vente for folk å sende meldinger og så når de gjør, sende dem. OK? Så bare for å oppsummere igjen, Apache og lignende webservere sånn gaffel en Mange tråder og prosesser som kan være litt bortkastet. Så jeg antar at spørsmålet som kan komme fra det er trenger vi å ha flere tråder og prosesser? Hva om vi bare hadde én? Så la oss slags male et bilde av hva dette vil se ut. Så la oss bruke bare én tråd. OK? Så tenk bare dette med en tråd. La oss anta at vi egentlig ikke gjør at mye nyttig - og når jeg sier nyttig, mener jeg beregningsarbeid - i de flere tråder før. Så la oss slags konsolidere alt inn i en tråd. Så hva om vi hadde en tråd som slag av bare går rundt i loop og stadig sjekker gjorde noe ny skje. Så for eksempel, noe nytt har skjedd kan bety jeg fikk noe tilbake fra databasen, eller noen sendte meg en ny HTTP-forespørsel. Så de er typer arrangementer det skje, ikke sant? Og så hva jeg kan gjøre når de nye ting hender er i denne samme tråd henrettelses, dette enkelt tråd av gjennomføring, kan jeg ringe noen kode som ville håndtere en bestemt ting. Så for eksempel, hvis jeg fikk noe tilbake fra databasen, kan jeg kjøre min liten beregnings del av det som faktisk bare forbereder ting til sende tilbake til brukeren. Så gjør den slags fornuftig? Men hva er egentlig den implikasjonene av dette? Høyre? Fordi vi har skrevet mye kode som - og jeg bare kommer til å hoppe fremover i lysbildene hvis det er OK. Så hvis du ikke har noe imot, jeg er bare kommer til å ta et skritt tilbake. Så denne typen ting er kalles en hendelse loop. OK? Og det er på en måte den grunnleggende Ideen bak node.js. Så hva Node.js er virkelig gjør som en web server er det en enkel tråd som er i utgangspunktet går rundt i en sløyfe som en stund en slags henhold panseret på Node.js det er stadig sjekker, vi får nye ting? Og da vil den kjøre handlers at du setter opp. Men et godt spørsmål å stille er, hvordan kan vi gjøre dette skje med eksisterende ting? Så jeg satte en linje med C-kode her som i utgangspunktet ser ut som det er åpning en fil, ikke sant? Jeg Hun bare kom ut med et album. Så jeg måtte åpne henne en ny fil. Så måten vår C-kode for drift - og jeg antar at grunnen til at jeg valgte filene var fordi dette er slik grad av I / O-arbeidet som vi har gjort i C i en følelse av at det er input output. Så vi kaller dette kode som gjør dette f åpen. Og deretter på den neste linje i vår program, kan vi nå jobbe med f. Så dette ville være et eksempel på noe det er som synkron eller blokkerer fordi på den første linjen Det vi venter til vi få filen åpen. Så på den andre linjen, vi vet at vi kan arbeide med f, men dette betyr at at andre linjen kan egentlig ikke kjøre til den første linjen er ferdig. Betyr det fornuftig? Så dette ville være ille å sette i en hendelseshåndterer. Og grunnen til det er at denne typen venter, ikke sant? Så dette ville gå tilbake oss tilbake til det samme. Og nå ville vi ikke engang ha den nytte av flere tråder eller prosesser fordi vi fikk en tråd i node.js. Betyr det fornuftig for alle? PUBLIKUM: Vent. Så hva er nytt? KEVIN SCHMID: Åh, så ja. Så jeg kommer til å få til erstatningen. OK. Så hva om vi hadde noe som så ut som dette? Så hva om nå jeg redigerte f åpne litt? Så jeg har bestått i samme to argumenter som før. Jeg fortsatt elsker den nye sangen at hun kom ut med. Men jeg har bestått en tredje ting som er denne variabelen kalles kode. Men hva er koden faktisk i denne sammenheng? Er det som en vanlig C-variablene? Det er en funksjon, ikke sant? Og det kan være litt rart fordi Jeg er faktisk som nå passerer en fungere i en annen funksjon. Så et par ting å merke seg om dette. One, er jeg faktisk ikke kalle koden funksjon. Så du ikke ser koden med venstre paren, rett paren. Jeg er bare passerer i kode. Og i C, hva dette ville faktisk gjøre er å gi meg en peker til at faktiske kode, og deretter dette kunne kjøre den. Men tenk om det som du er passerer kode kjøres når at filen åpnes. Men hva dette betyr er at nå Resten av mitt program som kunne gjøre andre ting, kan fortsette å gjøre andre ting mens vi, egentlig ikke vente, men bare ha på baksiden av hodet som når denne filen åpen, løp som Koden på toppen. Betyr det fornuftig? Og nå ideen bak Node.js er at koden i do stuff med f delen bør være ganske kort og enkel og grei og egentlig ikke være svært beregningskrevende. Det kan ha å åpne en annen fil, men som også bør være ganske rask fordi det skal bare si gjøre en annen f åpne og deretter ringe denne annen kode. Så bare for å være helt klar, den f åpne som gjør den nye Katy Perry sang gjort mp3, som kommer til å ganske mye tilbake umiddelbart. Og da kan vi bare fortsette å gjøre andre ting fordi alt som nå f åpen samtale gjør er å fortelle i utgangspunktet den underliggende f åpen kode åpne denne filen og når du er ferdig å åpne denne fil eller når du får den tilbake, deretter kjøre denne koden. Men det gjør faktisk ikke kjøre denne koden. Og du hadde et spørsmål? PUBLIKUM: Du syntes å antyde noen ganger at å legge beregnings intensiv kode slags bryte [Uhørbart] drevet system. [Uhørbart]? KEVIN SCHMID: Det er et stort spørsmål. Så jeg har faktisk et eksempel på hvordan du kan integrere beregnings intensiv kode i en liten bit. Så når vi kommer til de kodeeksempler, Jeg skal sørge for å trekke den. Er det OK? Takk. Hva var navnet ditt? PUBLIKUM: Aaron. KEVIN SCHMID: Aaron bringer opp et meget godt poeng, som er at hvis jeg hadde noen beregningsmessig intensive kode i det gjør ting med f del, resten av mitt program kan ikke løpe og kan ikke høre for nye forespørsler eller noe før alt at ting er ferdig. Så hvis jeg skriver Node kode generelt hvis vi ikke gjør noe at jeg kommer å foreslå senere når vi ser på kode eksempler, må jeg være sikker på at koden min ikke binder opp denne hendelsen loop. Betyr det fornuftig? OK. Cool. Så Node.js tilbyr dette rammeverket som du kan bygge disse hendelse drevet servere med. Så det har disse slags asynkron ikke-blokkerende I / O-biblioteker, mens standard C-biblioteker som vi har vært arbeider med, som om du bare bruke dem på samme måte som vi har vært å bruke dem med f åpner og ting, er de som blokkerer fordi du faktisk nødt til å vente på den filen du vil åpne. Men Node.js gir deg dette og det utgangspunktet båndene til Googles V8 Javascript-motor som er årsaken at Chrome er så rask på behandling Java fordi det har denne V8-motor. Så jeg vet det høres ut som en av dem WWDC utviklerkonferanser ting hvor de bare kaste en haug av brev tall ting for prosessorer og si at dette er så kult. Men det er kult at de gjorde dette fordi Java - eller kanskje hvis du ikke er kjent med Java ennå fordi vi ikke har hatt forelesningene på det - men Javascript er et tolket språk. Og dette er et viktig poeng også. Så det er viktig for vår web servere for å være rask, ikke sant? Og hvis vi bare kjører Java kode som ble tolket med bare noen gamle tolk det kan være treg. Så Node fordeler av å ha dette super rask V8 tolk. Og jeg vet ikke om de heter det fordi V8 slag i pannen ting, men OK. Så jeg har forberedt noen eksempler på denne nettadressen. Etter seminaret, jeg liksom skal snakke om hvordan du kan få Node sett opp, men for nå, jeg bare slags ønsker til å gå gjennom noen kodeeksempler. Så hvis du ønsker å følge med, all den kildekoden er tilgjengelig der. OK? Så jeg vil forlate denne nettadressen opp for en liten. Og så jeg skal bare slå inn i terminalen. Er alle bra med denne nettadressen? Så jeg kommer til å bytte over til terminalen min her. Så her er koden som Jeg har for i dag. Hvorfor gjør ikke vi starter med simpler.js fil? En annen ting er at alt dette koden kommer til å bli skrevet på Javascript som du kan eller kan ikke være kjent med. Jeg antar et par ting er at mye av Javascript-kode er den type syntaks og struktur er svært lik C, slik at du kan slags plukke den opp som hvert. Jeg har prøvd å skrive mye av startkoden for dette på en måte som er lik C, slik at den er litt mer lesbar. Men som vi avanserer, vil jeg være som viser noen av de ytterligere funksjoner i Javascript som er litt kult. Men la oss se på dette programeksemplet. Jeg tror alt er kuttet av der. Jeg skal bare fikse det virkelige raskt hvis det er OK eller ikke. Jeg vet ikke hva dette kommer til å gjøre. Er det litt bedre? Kan du se Var og ting? OK. Så den første linjen er som Java versjon av en variabel erklæring. Så bare for å markere hva dette ville se ut i C. Så dette er akkurat som meg å si indeksen tilsvarer tre eller noe sånt. Så jeg ikke spesifisere type. Javascript gjør har typer, men det er veldig dynamisk skrevet i naturen, så ikke gi noen slags form på det. Så har det bare var. Det er som variabel. OK? Og jeg ringer denne variabelen HTTP. Og på min høyre side, jeg har uttrykk for at jeg ønsker å sette i HTTP. Og dette sier krever HTTP. Så dette er ganske lik å inkludere. Det er litt mer som kraftigere enn inkludere i den forstand at inkludere ville bare kopiere og lime inn header fil for funksjons prototyper eller hva med de typedefinisjoner. Men krever faktisk går for å få oss koden. Så du kan tenke på det som importere noen kode. Så et eller annet sted i Node.js modulen system eller hva, de har alt dette HTTP server kode så jeg er bare hente det for min egen personlig bruk i dette programmet. OK? Så da jeg har denne funksjonen som jeg har skrevet. Og legg merke til at jeg ikke har til å spesifisere returtypen eller typen av argumenter igjen. Så slags løs skrevet i den slags følelse. To argumenter som det tar i, forespørselen og respons. Så det er konseptuelt typen som kjent fra det bildet som vi hadde på skjermen før fordi vi får denne forespørselen at vi ha fra brukeren. Og så har vi et svar som vi kan skrive ting til. Så den første linjen av dette gjør res.writeHead 200 og deretter dette innholdstype tekst sletten. Så la oss sette dette fra hverandre litt. Så la oss bare fokusere på res.write for en liten. Så skrive er utgangspunktet, og skrive hodet, er bare måter å liksom skrive ut ting til responsen. OK? Så skriv hodet, hvis noen husker fra HTTP-forelesning, gjør dere husker overskrifter på toppen av HTTP tingen? Så hvorfor ikke jeg bare demo overskrifter virkelig rask. Ville det være nyttig? Eller skal vi bare liksom - OK. Jada. Så når nettleseren går til google.com eller noe sånt, det er faktisk litt mer - dette er som en hemmelighet - det er som en litt mer informasjon som kommer gjennom røret enn bare den lille søk og alt. Så for å vise deg dette, kommer jeg til å bruke et program som heter Curl. OK? Så dette er noe som du kan kjøre på Mac OSX kommandolinjen eller i apparatet eller hva. Og så hvis jeg Krøll HTTP google.com, Jeg kommer til å se HTML. Og dette er, i rettferdighet, bare HTML den slags forteller deg til omdirigere til www hvis nettleseren ikke automatisk håndtere omdirigering. Så dette er bare HTML, men jeg skal å legge til Curl denne bindestrek flagger jeg. OK? Og dette kommer til å vise meg overskriftene. Så dette er også informasjon som kommer gjennom når jeg får dette svaret. OK? Så på toppen, ser du dette HTTP 301 flytte permanent. Og dette er ganske viktig fordi Dette refererer til statuskoden. Så det 301 her er statuskoden, som er utgangspunktet bare et heltall som forteller nettleseren eller den som er leser dette, hvis du late som du er en nettleser og du ser dette, utgangspunktet nå hvis du ser på det og du ser en 301, vet du jeg har å gjøre noe spesielt basert på 301, eller noe spesielt som skjedde basert på 301. Så det sier flyttet permanent. Og så, i utgangspunktet, har vi en haug med sentrale verdi-par. Så vi får plasseringen er www.google.com. Og så slags alt dette andre ting, men innerst inne, hva plasseringen er ordtak er den nye plasseringen er på www.google.com. Så nå hvis du går til google.com, vil du liksom se nettleseren slags blink for et sekund og deretter omdirigere deg rett tilbake til www.google.com. Så svarene kan inneholde disse overskriftene. Og et par ting å påpeke. Så la oss si at vi var faktisk vellykket i å besøke en nettside. Så la meg gå til - hva er en god nettside? Jeg er dårlig på å tenke på god nettsteder på stedet. PUBLIKUM: Wikipedia. KEVIN SCHMID: OK. La oss gjøre Wikipedia. Så her ble jeg flyttet. Å vente. Var jeg? Ja, jeg var det. OK. Så fikk jeg til å gjøre www. Så jeg kommer til å gjøre www. Og som du kan se, er her hele HTML at nettleseren vil behandle for Wikipedia. Men hvis jeg fortsetter å rulle opp her, hva jeg vil se på toppen - wow, det er mye av HTML på Wikipedia - men det jeg kan se på toppen her er dette 200 statuskode i motsetning til den 301 som jeg så tidligere. Og legg merke til at den har en fin vennlig OK ved siden av den. Så dette er som den gode statuskode. Betyr det 200 nummeret ser kjent ut? Ja, fordi når jeg gjorde simpler.js, Jeg skrev en 200 der. Så det er i utgangspunktet si fortelle leseren eller den som prøver å få til Dette at de var vellykket. Eller at typen som vi var vellykket også. Og det er denne typen spesiell syntaks i Javascript for å erklære en kartet av disse tastene som innholdstype og disse verdiene som tekst sletten. Så hvis du ser på den responsen som vi kom tilbake fra Wikipedia før, - Jeg kommer til å prøve å rulle opp litt raskere - du har disse nøklene som server og disse verdiene Apache. Så du har fått nøkler og verdier. Og du kan angi dette i Node hva som skal sendes tilbake. Så dette er faktisk slags, i noen måter, og på noen måter er det ikke egentlig, men det er et litt lavere nivå enn PHP-koden som du kan være skrive for P satt syv fordi PHP og Apache liksom ta vare på noen av disse tingene for deg. I PHP, kan du overstyre standard atferd ved å skrive dine egne overskrifter. Men i forbindelse med dette, får vi å skrive ut våre egne overskrifter. Så betyr at linjen fornuftig å alle, skrivehodelinjen? OK. Awesome. Så hva jeg gjør er jeg avslutte svar ved å si hei verden. OK. Men det er bare en funksjon kalt forespørsel behandleren. Så nå er jeg faktisk nødt til å slags gjøre noe med denne funksjonen, ikke sant? Så her er hva jeg gjør er det er dette linje som gjør Var server, er lik HTTP.create server, og da jeg passere i forespørselshåndtereren. Så dette er slags Node måte å skape en server. Og legg merke til at jeg har bestått i forespørselshåndtereren. Så dette er å fortelle createServer funksjon som jeg vil at du skal gjøre meg en server, og når serveren mottar et svar, jeg trenger deg til å kalle dette be behandleren funksjon. OK? Slik at linjen ganske mye ferdig med en gang. Så VaR server linjen er gjort riktig Når du gjør det ganske mye. Jeg mener, har det å sette opp noen interne staten for å vite at du ville ha til kaller det forespørselshåndtereren funksjon, men det er ikke til å sitte der og si har brukeren sendt meg en forespørsel ennå? Har brukeren sendte meg en forespørsel ennå? Så det ikke blokkerer. OK? Så hva dette vil gjøre er det i utgangspunktet Nå lagrer en peker til denne koden, Dette forespørselshåndtereren funksjon, og deretter vil kjøre den koden når noen gjør en forespørsel. Og så gjør vi server.listen. Den 1337 er det ganske vilkårlig. Jeg hadde ingen spesiell grunn for å plukke det nummeret. Det var helt tilfeldig. Men som bare angir port. Så de fleste webservere vil du se at de bruker port 80 fordi det er slags av som konvensjonen. Så hvis jeg går til noe sånt, Jeg vet ikke, Wikipedia.org, og jeg satt kolon 8 - oh wow, kan du ikke se det. Jeg beklager. Men hvis jeg gjør Wikipedia - Jeg skal skrive det her bare slik at det er klart på kameraet. Men hvis jeg tar dette inn i en nettleser med et kolon 80, som angir gå til Wikipedia.org på port 80. Så det er som hvordan USA har flere porter som hvor du kan sende ting til slags. Så det er som å gå til denne spesielle plasser på denne serveren. OK. Så valgte jeg bare 1337. Det er en hel rekke med tall at du kan plukke. Det var ikke helt spesiell. Men hva jeg skal gjøre nå er jeg kommer til å kjøre Node. La meg faktisk inn som et par linjer ned, slik at du kan se det. Jeg kommer til å gjøre Node, og jeg er kommer til å kjøre simpler.js. Og vi skal snakke om hvordan du får Node satt opp i en liten bit. Men nå er det bare å kjøre på serveren. Så en ting vi kan prøve noe som kanskje ikke være så spennende er at vi faktisk kan prøver å bruke den i Curl. Så jeg kan gjøre Curl, og min Maskinen er lokale verten. Du vil også se dette skriftlig som dette noen ganger. Lokal vert og 127.0.0.1 er snill som din hjemme-PC. Så det er som å snakke til din egen datamaskin. OK. Og så kan jeg si 1337. Så hvis jeg kjører denne linjen med kode, det sier hallo verden. Og hvis jeg ønsket å se at ting som hadde innholdstype teksten vanlig eller uansett, jeg kunne selv sette dette her. Og legg merke til at det står OK. Og jeg har tekst sletten. Og så er det slags alt dette andre ting som Node vil legge i der for meg. Det er ikke super viktig. Jeg mener, det er en slags teknisk aspekter ved som er snill kult å snakke om, men bare for å vise du, jeg har også makt til å endre disse rundt. Så jeg kan bare legge til en haug av sånt. Og så nå, hvis jeg ser i mitt utgang, vil det være slik at. Så disse overskriftene mener visse ting til nettlesere og sånt. Og overskrifter kan i utgangspunktet fortelle en nettleser hvordan å svare på noe. Hvis du noen gang har hørt om cookies før, eller hvis du noen gang har vært irritert av en web-side å sette cookies, eller slått på cookie blokk eller noe sånt. Du kan faktisk sette cookies i disse overskriftene. Så de forteller en leser hvordan du virkemåte i noen tilfeller. OK. Så det var simpler.js. Er det noen som har noen spørsmål på at kildekoden filen? OK. Cool. Så la oss fjerne r fra at og se på simple.js. Så dette er ganske mye det samme programmet. Jeg bare skrev det litt annerledes fordi jeg ønsket å sortere av høydepunkt noen funksjoner i Javascript. Så merker at forespørselshåndtereren Funksjonen har helt forsvunnet. Oh ja, hadde du et spørsmål? Målgruppe: Ja, argumentene som er gått til at funksjon, hva er de? KEVIN SCHMID: Så de er Java gjenstander. I dokumentasjonen Node.js, det utgangspunktet sier hvilke metoder er tilgjengelig for dem. Vi bare tilfeldigvis har tilgang til denne metoden kalles skrive hodet og slutten og sånt. Men det er en hel haug flere metoder. Og for eksempel, som en av dem spesielt på rec, kan du gjøre noe som rec.method som vil fortelle deg om det er en HTTP få eller HTTP POST forespørsler og ting som det. Så det er alle slags forskjellige egenskaper, men de er begge Java gjenstander, og de bare har funksjoner knyttet til dem at du kan skrive ting til. OK? Så merker at forespørselshåndtereren er helt borte. Men den koden som jeg hadde i forespørsel behandleren er der fortsatt. Jeg har fortsatt denne res.writeHead og jeg har fortsatt denne res.end. Og hva dette er et eksempel på i Javascript er denne ideen om en anonym funksjon. og anonymt er som et passende navn for det fordi det bokstavelig talt ikke ha et navn. Det er ingen forespørsel funksjon handler der. Har ikke noe navn, men det fortsatt er å ta et argument. Så fortsatt har jeg rec og res. Og jeg har fortsatt koden. Dette er helt greit Javascript-kode. Så kan jeg erklære en funksjon uten eksplisitt å gi den et navn. Det er litt forvirrende i begynnelsen. Det er noen som nyttige ting at du kan gjøre med disse anonyme funksjoner. Er det noen som har noen spørsmål om dette, eller er det OK bare for å, for nå, liksom bare akseptere at det vil gjøre det samme? Jepp? PUBLIKUM: Er funksjonene først klasse i Javascript? KEVIN SCHMID: De er først klasse i Javascript. Og bare vet at disse begrepene passerer i en anonym funksjon som Dette gjelder for Javascript som du kan skrive i det ferdige prosjektet for nettleseren også. Så for eksempel, i Javascript leseren din, er det også noe arrangement drevet i den forstand at hva du vil har er når brukeren klikker på denne knappen, vil jeg du skal kjøre denne koden. Så det er samme type ideer av klientsiden når et museklikk eller de musen over noen bilde på din webside, kjøre denne koden. Det kan gjelde for servere. Så det er typen som den spennende Grunnen til at Javascript er et virkelig egnede eller noen folk tror det er en egnet språk for denne typen event driver serveren fordi du har disse anonyme funksjoner. Du har hele ideen om denne asynkron kode. OK. Noen som har noen spørsmål? OK. Så det var simple.js. Så la oss se på en mer eller et par til. Så dette er sleep.js. Så er noen kjent med C-funksjonen søvn? Fra kanskje en av de tidligere foredrag eller noe sånt? Så i utgangspunktet kan du passere i Jeg tror en antall sekunder eller hvis du bruker U sove et antall millisekunder eller nanosekunder. Og i utgangspunktet programmet vil bare stoppe kjører for det beløpet av tid. Høyre? Og så vil det våkne opp til slutt og så det vil bare fortsette å kjøre programmet. Så denne serveren slags gir inntrykk av å sove. Så merker at vi har den samme res.writeHead 200 med overskriften som før, men da vi ringer dette Funksjonen kalles timeout sett. Sett timeout er også tilgjengelig i nettleseren Google Chrome eller Safari eller hva. Og i utgangspunktet hva det gjør her er det er å ta i en funksjon. Innkalling, igjen, det er en anonym funksjon. Så det er litt kult fordi vi er ved hjelp av en anonym funksjon innenfor en anonym funksjon som kan være litt rart. Men det tar den funksjonen, som er utgangspunktet si - og måten dette gjerninger er i 5000 millisekunder, jeg vil du å utføre den funksjonen som bare ender responsen og skriver hei. Så dette gir inntrykk av at sove, men måten dette faktisk fungerer er vil vi gå gjennom denne linjen veldig raskt. Vi bare skriver noe. Og da vil vi også kjøre gjennom denne linjen veldig raskt. Så vi ikke blir faktisk kommer å vente i fem sekunder. Vi kommer bare til å kjøre denne koden umiddelbart. Og så er det, igjen, denne lille event loop som nå har denne tingen registre som i utgangspunktet er like stadig går rundt i en sirkel og ser på klokken i en enkelt tråden og ordtak, har fem sekunder gått ennå? Og så når den ser at andre hånd har beveget seg som fem sekunder eller uansett, så det våkner opp og sier, oh, hva må jeg gjøre? Å jeg må kjøre denne koden. Og så kommer det til å kjøre res.end hei. Så igjen, vi aldri venter her. Så det er ikke slik at denne koden på innsiden av denne funksjonen kommer til å ta fem sekunder å kjøre. Denne koden vil kjøre ganske mye momentant, i det minste i forhold til de fem sekunder at vi snakket om tidligere før. Så bare for å vise dette i handling, Jeg kan gjøre Node.sleep.js. Og det gjorde jeg rotet opp noe? Muligens. Unnskyld. La oss se hva vi kan gjøre for å fikse dette. OK. Så definitivt bruke node.js. Jeg bare tuller. OK. Bare ett sekund. OK. Jeg vet hva det er. Så problemet er at i min andre kategorien her, ble jeg kjører Node allerede på at samme adresse, 1337. Så feil som dette kastet, hvis vi ser på det reelle tett, er adressen i bruke, EADDRINUSE. Så jeg brukte allerede 1337 her. Så hvis jeg slår dette av, og da jeg nå prøve å kjøre dette, forhåpentligvis, alt vil bli bra. OK. Så du kan bare ha én ting liksom av å lytte på en port på en gang. En annen løsning ville ha vært for meg å bare redigere det programmet og gjøre det være som 1338 eller noe sånn. Men nå sover kjører. Så la oss faktisk prøve det ut i leseren denne gangen fordi det er en litt lite spennende å se den i en terminal. Så jeg bare kommer til å gå til det 127-adressen igjen på 1337. Og hvis du kan se det - Jeg vet ikke om du kan - men min leserens tar en veldig, veldig lang tid å laste eller som fem sekunder. Og så etter det, det endelig endte responsen. Og du kan ikke se det, fordi ting er flyttet over en liten, men hvis jeg gjør dette en litt mindre, du kan se det sier hei. Så jeg fikk hey, men etter fem sekunder. Og det kan være litt renere å se det her på terminalen, så jeg er kommer til å gjøre en - la oss gjøre her - la oss gjøre Curl som adresse igjen med 1337. Og jeg bare slags nødt til å sitte her i fem sekunder. Men legg merke til at serveren kan akseptere nye svar. Så det skriver hei. Og til demo dette, innerst inne hva Jeg kan gjøre i denne andre kategorien - så la oss si at jeg gjør dette i en annen fane, Jeg kommer til å gjøre Curl og det samme ting igjen. Og jeg kommer til å prøve å sparke disse gutta av på samme tid. Så jeg kommer til å gjøre dette, og jeg er kommer til å rase over her, og jeg er kommer til å gjøre det igjen. Og la oss gjøre det slik at du kan se til begge. At man trykt hei og at man trykt hei hele veien på - la oss gjøre det eksperimentet igjen. Egentlig, la oss bruke dette lure, hvis det er OK. Så jeg kommer til å bruke et skall ting som tillater meg å kjøre i utgangspunktet to eksemplarer av dette programmet i parallell. Så det vil kjøre det første programmet og det andre programmet i parallell. Så nå hvis jeg trykker på Enter, det kommer å gjøre at forespørselen ganske mye umiddelbart på samme tid. Så la oss gi dette en sjanse. Så nå legger merke til det står to prosesser. Og hvis du er nysgjerrig, at 27 000 nummeret er i utgangspunktet prosessen ID. Og så legge merke til, de trykte hey samtidig. Det var ikke som vi måtte vente fem sekunder for ett og deretter etter at, fem sekunder senere få andre. Så det er slags, på noen måter, er det egentlig ikke bevis, men det er intuitiv bevis for at det er ikke bare som venter fem sekunder og blokkerer hele tråden. OK kult. Så Aaron stilte et spørsmål tidligere at var, vel hva hvis vi gjør noe - Jepp? PUBLIKUM: Vent. Hvordan er det forskjellig fra printf buffer, skjønt? Betyr ikke det automatisk gjøre det? Hvorfor har vi å bekymre deg om det? KEVIN SCHMID: Oh, kunne du si det en gang til? PUBLIKUM: Liker ikke printf buffer gjør akkurat det samme? KEVIN SCHMID: The printf buffer? PUBLIKUM: Yeah. OK. Var ikke i en av de testene de var snakker om hvordan hvis du høyre printf noe, og så har det pause ett andre, og da har du det løkke ti ganger, vil det vente ti sekunder og deretter printf alt sammen? KEVIN SCHMID: Oh, OK. PUBLIKUM: Er det å gjøre det samme ting så i dette tilfellet? KEVIN SCHMID: Så spørsmålet var utgangspunktet i en av de tidligere spørrekonkurranser eller noe, det var et spørsmål som utgangspunktet hvis du sier print f 10 ting om gangen og deretter sov som i prosessen med å skrive dem ut, ved enden av en eller annen grunn, ville det bare dumpe dem alle ut på skjermen. Så det er på en måte to forskjellige konsepter her. Så jeg antar en ting er at, i dette tilfelle, vi arbeider med to forskjellige slags folk som spør serveren for ting på samme tid. Og på grunn av at den printf slags venter sånn og dumper det ut samtidig er mer relatert til hvordan printf slags - så veien printf er faktisk implementert er det i utgangspunktet må snakke med operativsystemet for å skrive at ting til konsollen. Så det vil ikke gjøre alt dette ting umiddelbart når du sier printf noen streng fordi det kunne bli dyrt hvis det må gjøre det hver gang. Så hvis du gjør printf hei, programmet kan faktisk ikke ut som umiddelbart til konsollen. Den kan si, OK, jeg skrev det. Og så slags vente for deg å gi det litt mer før de faktisk skrive det ut til konsollen. Så grunnen til at det var tilfelle - og det er på en måte som ikke er relatert til søvn - er at søvn var liksom bare injiseres i det å demonstrere faktum at den ikke skrive det synkront. Men grunnen til det er nettopp ytelse, slik at du ikke trenger å gjør at mange kontakter til operativsystemet. Men her, hva vi egentlig prøver å gjøre med denne søvn greia er bare showet at når vi har to personer på besøk dette nettstedet, er det ikke kommer til å sette dem i en linje der det kommer til å si Jeg må hjelpe deg, og da når jeg er helt ferdig å hjelpe deg etter disse fem sekunder, så jeg kommer til å gå til neste person. Så den første personen anmodning ikke binde opp den hendelsen sløyfe hvis det er fornuftig. Men her er faktisk et eksempel av noe som vil binde opp hendelsessløyfen. Så her er en fryktelig funksjon til beregne n'te Fibonacci. Det er bokstavelig talt det verre måten du kan beregne n'te Fibonacci-tall. Og dette er faktisk bare å erkjenne hvor dette kom fra, det er faktisk - Jeg mener, kan du prøve å gå finne det - men det er som en veldig lang blogg innlegg som noen skrev. Det er som en av de Reddit ting. Men noen kritisert Node.js, og de brukte dette som et eksempel. Så jeg slags ønsket å bare vise dere to ulike perspektiver bare for å få en generell forståelse av begrepene bak disse to tingene. Men dette er valgt som bare en fryktelig, forferdelig ineffektiv computationally krevende måte å beregne n'te Fibonacci-tall. Så akkurat som en side note, hvorfor er det fryktelig som på en måte? Jepp? PUBLIKUM: Si du starter ut med 1000. 1000 deler seg i 999 og 998. Hver av dette splittes i to ting. Hver av dette splittes i to ting. KEVIN SCHMID: Høyre. PUBLIKUM: Hele veien ned. KEVIN SCHMID: Nettopp. Så bare for å gjenta for kameraet, hvis jeg kaller løgn på som 1000 eller noe sånn er det tydeligvis ikke mindre enn eller lik ett så jeg kommer til å gå til denne andre saken, og da jeg kommer å kalle fib 999 pluss fib 998. Og da stort sett alle som arbeid som fib 999 gjør er type på dette nivået. Hvis du går ned, er det enda mer overflødige enn det, men hvis du bare tror databehandling FIB 998 får oss ganske nær fib 999. Så vi burde egentlig være litt mer smart om hvordan vi på en måte gjenbruke disse, men vi ikke er gjenbruk disse tingene i det hele tatt. Så du kan forestille deg dette gigantiske, gigantisk tre som er bare fryktelig. Men uansett, OK. Så det var løgn. Det tar bare litt tid å kjøre. Jepp? PUBLIKUM: [uhørbart]. KEVIN SCHMID: Oh, kunne du gjenta spørsmålet? PUBLIKUM: [uhørbart]. KEVIN SCHMID: Åh, så dette er bare kode som kommer til å være liksom på server side. Så dette ikke kommer til å bli funnet i nettleseren eller noe. Det er i utgangspunktet det vi har er at når brukeren her ganske mye merker deres anmodning igjen, når vi liksom gjøre en forespørsel, kommer vi til å ringe denne funksjonen på serversiden. Og så skal vi få resultatet tilbake fra å kalle denne funksjonen. Og så får vi bare skrive ut det til brukeren. Så brukeren ikke egentlig forholde med denne funksjonen for mye. Var det spørsmålet? Betyr det fornuftig? OK. Cool. Så igjen, gjør vi dette hele res.writeHead ting hvor vi skrive ut overskriften. Og da jeg avslutte respons ved å gjøre det magiske tallet er løgn 45. Så la oss bare kjøre denne serveren. Så jeg kommer til å gjøre en node fib.js. Så nå er min løgn serveren kjører. Og så her, jeg kommer å gjøre en av disse. OK? Så jeg bare kommer til å si, Curl. Så det kommer til å ta litt tid, men forhåpentligvis snart vil fullføre og det vil skrive ut at 45th Fibonacci-tall. PUBLIKUM: [uhørbart]. KEVIN SCHMID: Det bør få gjort ganske snart. Så det skal ta fem til seks sekunder. Jeg vet ikke det er bare V8 blir super hurtig, men i noen tilfelle, er dette en svært kort eksempel og vilje uelegant av en ikke-triviell beregningen. Så etter en stund, blir det dette. Men nå, hva hvis jeg gjør det samme slags eksperiment som før hvor jeg gjør to forespørsler på samme tid? Så her skal jeg en Curl på som adresse, og jeg skal å gjøre en annen Curl. Og husk, når vi gjorde dette for sove server, da vi i utgangspunktet hadde det etter fem sekunder, de ganske mye begge kom tilbake rett omtrent på samme tid. Så det var ikke særlig bundet opp. Men la oss prøve det nå. OK, så vi fikk våre to prosesser. Husk de er prosess IDer. Dette kommer til å være litt klosset mens vi stall. Så la oss bare bli her og vente. Så en av dem skulle komme tilbake etter som - OK, så kom tilbake. Men så gjorde ikke hvorfor den andre man kommer tilbake ennå? Jepp? PUBLIKUM: Serveren kan ikke gjøre noe mens det å beregne det store antall. KEVIN SCHMID: Høyre. Så svaret var bare at serveren egentlig ikke kan gjøre noe mens det er å beregne som Fibonacci-tall. Så nå har jeg nettopp fått mine to ting tilbake. Men jeg antar bare å tenke på koden litt mer, hvordan det fungerer og alt. Så denne funksjonen her er koden som Jeg har fortalt denne serveren til å kjøre når det mottar en ny innkommende forespørsel. Så det er bare kommer til å kjøre gjennom dette hele koden, og deretter kommer det til å gå tilbake til hendelsessløyfen, og fortsett deretter sjekker for nye hendelser. Så i utgangspunktet det vi har skjer er serveren er lytte til nye ting. Den første personen ber om hva 45 er. Vi kjører denne koden for å beregne det. Denne koden tar omtrent fem til seks sekunder å kjøre. Så går vi tilbake til hendelsen sløyfe og se etter nye forespørsler. Så dette er et eksempel på hvordan, hvis du har ting som er såkalt beregne bundet, eller bruker mye av beregningsorientert, ikke makt, men som er beregningsmessig intensive - Jeg antar en ting å si om dette er at denne funksjonen gjør helt, for det meste, ganske nyttig arbeid høyre. Hele tiden at at tilbakeringing funksjon var i gang, var det ganske mye å tilbringe mesteparten av sin tid bare databehandling som n'te Fibonacci-tall. Men vi hadde bare én tråd å forholde seg til. I Apache-modellen, når to mennesker gjorde forespørselen å få fib 45, vi ville ha hatt to forskjellige tråder. Og deretter operativsystemet jobb ville ha vært, eller brukernivå kode som styrer trådene, ville har vært å skjære den opp på CPU, eller selv om du hadde flere prosessorer, fordele dem jevnt over CPUer slik at de begge var ferdig omtrent på samme tid. Så bare for å vise deg hvordan vi kan sortere av - og dette er ikke en total perfekt løsning, men liksom hvordan vi kan gjøre en komme tilbake hit og gjøre litt bedre. Så det jeg har her er et program som heter FIB C. Og dette bruker i utgangspunktet en annen av Node moduler kalt Barneprosessmodul. Så jeg har tatt det på toppen slag av at jeg ville gjøre en halvkilo inkluderer barnet process.h eller noe. Nå har jeg tilgang til denne CP variabel som har all min funksjonalitet. Så nå hva jeg gjør i dette svaret behandleren er jeg kjører dette programmet dot slash løgn 45. Så det jeg har gjort - og jeg skal bare å gå ut av dette programmet for en litt - er at jeg har skrevet et C-program som utgangspunktet beregner n'te Fibonacci-tall. Så her er bare et program jeg har skrevet i C som beregner dette. Jeg kan kompilere den, og jeg kan kjøre det på kommandolinjen. Og det kommer til å beregne 45th Fibonacci-tall. Så merker det tar bare ganske mye så lenge. Jeg kunne sannsynligvis ha brukt dash 03 til optimalisere det eller noe sånt, men jeg bare gjorde som vanlig kompilatoren innstillinger. Og det skriver den ut. Men nå, hva er det jeg slags gjør? Oh sorry, feil fil. Så jeg gjør de samme tingene med overskriften som før. Da jeg gjør dette cp.exec. Så hva dette kommer til å gjøre, er det kommer til å kjøre dette programmet. Men måten dette fungerer på er at det er ikke til å vente på at programmet skal bli ferdig. Den sier bare utgangspunktet gjennomføre dette programmet. Så i utgangspunktet skrive dette inn i ledeteksten slags. Og så, når du er ferdig med det, kjøre denne funksjonen. Så nå er vi på en måte få dette Hele restaurert saga som om vi ikke venter. Betyr den slags fornuftig? Jepp? PUBLIKUM: [uhørbart]? KEVIN SCHMID: Så dette vil faktisk åpne opp en ny prosess for å gjøre det. Så dette er faktisk, på noen måter, onde, ikke super onde, men det er viktig å si at dette er slags kommer tilbake til, på den ene siden, Apache modell der vi gjør tråder og prosesser for hver forespørsel eller prosesser for hver forespørsel. Så dette er slags analogt til hva Apache gjør. I noen tilfeller vil det bare bruke en ny tråden, som er litt mer lys vekt enn en prosess, men Apache kunne ende opp forking en ny prosess som er litt av det vi gjør her implisitt ved å gjøre dot slash løgn 45. Og da i så fall, vi slags pådra de samme utgiftene til prosesser. Så dette er bare en ting du kan gjøre. Men bare for å vise denne typen løping. Og dette snakket er bare veldig rettet mot presentere disse slags programmer som en måte å vise ulike perspektiver på hvordan å designe servere sånn. Så dette er i gang, og deretter nå hvis jeg gjør dette igjen, fikk jeg to prosess IDer. La oss bare snakke om ting å påpeke. Så merker at de er trinnvis. Det er kult. Fordi det var 27 122 før. Men legg merke til nå, kom de tilbake på omtrent samme tid. Og nå, et godt spørsmål å spørre om hvorfor var at saken er, hvis jobb var det nå for å liksom gjøre disse tingene slags spille fair med hver andre, disse to tilfeller av dot slash FIB 45 at jeg løp eller at Node løp? Hvem slags gjør det rettferdig at de begge bli slags balansert kjøretid? PUBLIKUM: [uhørbart]. KEVIN SCHMID: Yeah. Så i utgangspunktet, når jeg gjør dot slash liten løgn 45 eller noe sånt, nå er det slags opp til operativsystemet for å håndtere runtime av disse programmene. Og nå kan det planlegge dem på forskjellige prosessorer eller det kan planlegge dem. Det kan skjære opp den tid som en CPU blir den eller at de får for å kjøre på en CPU. Så det er tanken bak det. Betyr det fornuftig for alle? Så nå Node er egentlig ikke spiller en del i å dele opp disse oppgavene. OK. Så det er nesten det for eksempler. Jeg ville bare vise en ting fordi mye av dette så langt har vært Ikke helt super praktisk i noen tilfeller. Jeg kan tenke meg å komme hjem etter dette snakke og noe og si like, vel jeg slags fikk ut av den talen som Jeg kan lage en Fibonacci-server for mitt siste prosjekt. Så her er bare liksom enda et eksempel som forhåpentligvis vil være - kanskje ikke, men kanskje - litt mer slags relevante for slutt prosjekter og tenke fremover for sånt. Så dette er chat.js. Så dette er typen som noen eksempler server side kode som du kan bruke til å sette opp en liten prat server som du kanskje har sett på Facebook Chat eller hva. Så jeg sier ikke at dette er som Facebook Chat, men dette er slags som en god - kanskje ikke bra, men kanskje god - utgangspunkt for en prat server for nettstedet ditt for et avsluttende prosjekt. Så la oss se på hva det gjør. Så vi får denne spesielle tingen på toppen, Var denne SIO tilsvarer krever Socket.IO. Så dette er en annen ting som det ikke faktisk kommer bundlet med Node men du kan installere den. Det er en Node-modul. Så det er akkurat som noen utvidelse til Node. SocketIO er faktisk veldig slags kult. Det er en abstraksjon som i utgangspunktet hva den gjør er er det tillater deg å har denne strøm av kommunikasjon mellom en web nettleser og en web server. Så for det meste så langt, har vi hatt disse svært rask ett sekund eller to andre kommunikasjon mellom en web leseren og webserveren. Så det er i utgangspunktet gå til google.com, get ting, sende den tilbake, og deretter vi er ferdige. Vi kommer aldri til å snakke igjen før brukertyper i noe annet. Men hva Socket.IO og lignende type ting - og SocketIO er faktisk en av de tingene som er bygget på som WebSocket som er liksom tilgjengelig som en del av HTML5 - som tillater deg å ha denne fortsetter dialogen. Og dette er svært nyttig i en chat-server type ting fordi det er type som en kontinuerlig dialog i noen måter fordi hvis du chatter med noen, kan du nå bare sende en Melding ned røret, og deretter serveren kan sende en melding til nabo rør til den andre personen du er chatter med. Og så kan du ha denne utveksle sånn. Så det er litt av hva SocketIO er god for. Grunnen til at SocketIO bruker WebSockets som en ting er at i tillegg til bare ren gamle WebSockets, det gjør også noen triks for å i utgangspunktet gjøre det nettleseren kompatibel. Så nettlesere som Internet Explorer dessverre ikke støtter WebSockets rett ut av boksen. Så det bruker en annen type kule ryddig ting med Adobe Flash for å tillate deg å ha kors nettleser støtte. Så det er veldig nyttig. Og faktisk, jeg vet jeg er litt kjører på tid her, men CS50 Diskuter, har du noen gang sett noe lignende, vet jeg ikke, blank så og så er svarer på dette innlegget, eller noe sånn, at funksjonen? Det er SocketIO. Så når noen begynner å skrive i diskutere boksen for å gjøre et svar eller noe, men leseren din hva som er heter i SocketIO avgir en slags hendelse som sier noen er svarer på dette innlegget. Da sier serveren, OK, hva må jeg gjøre? Vel nå har jeg til å fortelle de andre gutta som er på CS50 Diskuter ute på dette innlegget at noen har du svarer. Så det er litt av hva SocketIO er god for, dette fortsetter slik strøm av dialog. OK. Så det jeg har her - og vi er bare kommer til å ignorere rekke tilkoblinger for en liten bit - hva jeg gjør er jeg en annen lytter. Så det er bare slik i Socket.IO er sier la oss lytte på denne porten. Og så gjør jeg dette ved tilkobling. Så det er bare utgangspunktet Socket IO måte å si, når vi mottar et tilkobling, jeg vil ha deg å kjøre denne koden. Og legg merke til at i stedet for å ha rec og res vedtatt i det jeg har Socket. Og dette Socket ideen er i utgangspunktet dette ting som du kan skrive til og lese fra som har brukerens meldinger muligens. Og meldingene som du vil sende kan gå gjennom den Socket. Betyr det fornuftig? Så det er dette fortsatt tingen. Så det jeg gjør er at jeg kaller Socket.emit. Og avgir tar ganske mye to argumenter. Det første argumentet er en streng bare representerer den typen ting du avgir. Så for denne saken, jeg har bruk denne strengen ny melding. Og det er bare i utgangspunktet si at type denne tingen, hva jeg er sending, er en ny melding. Så du kan lytte til bestemte typer som ny melding eller noe ved å bruke prikk på. Så tilkobling og brukervennlig sendt dit, hvis du ser på hvor vi kaller prikk på, de er andre strenger som representerer typer brukermeldinger. Så det er i utgangspunktet du kan ha denne emit ett av disse meldingstyper, og deretter gjøre noe som respons på ett av disse meldingstypene Så jeg sender ut denne nye meldingen. Vi kommer til å ignorere connections.push for en andre. Men da sier jeg, Socket.on bruker sendt. Så nå er det er typen som når bruker sender meg en melding, jeg vil du å kjøre denne koden. Og legg merke til at det anonym funksjon tar i denne variabelen heter data som er utgangspunktet går å ha brukerens budskap. Så la oss nå slags snakk om matrisen tilkoblinger. Så dette er utformet for en chat-klient hvor utgangspunktet alle er litt i samme chatterommet. Så i utgangspunktet, hva vi trenger for å holde rundt er noen array som i utgangspunktet representerer alle de folk som prater i noen måter, hvis det er fornuftig. Høyre? Fordi vi trenger å vite hvem disse gutta er slik at vi kan sende dem meldinger at andre folk sender til oss. Så hva denne koden gjør er når brukeren sender en melding - som er den typen arrangementet - vi kommer til å kjøre denne koden. Og det vi gjør er vi kjøre gjennom dette array som vi har kalt tilkoblinger. Og ganske mye for hver tilkobling bortsett fra den som er vår, det er hva denne koden sier, vi sender en ny melding med at vedlagte meldingen informasjon. Så hvis du legger merke til her, hva jeg gjorde da brukeren faktisk gjør en ny forbindelse er at jeg har lagt med JavaScript.push metoden, er denne utgangspunktet bare si som legger at Socket som en verdi i våre forbindelser array. Så nå når denne koden kjøres, vil det sende ting til de aktuelle tilkoblinger. Så dette kan være et godt utgangspunkt for å lage en chat-server eller noe lignende. Og hva slags kule er at den kode som du ser her for like på og avgir og sånn er den samme slags Javascript-kode som du ville skrive i nettleseren for å samhandle med serveren. Så det er derfor SocketIO er slags ryddig og nyttig på den måten. Oh og bare en ting virkelig rask. Det var en CS50 avsluttende prosjekt i fjor som i utgangspunktet implementert en prat server i node.js. Jeg tror det er Harvardchats.org men jeg er ikke - OK. Jeg er ikke sikker på hva nettadressen er, men Jeg kan sende det ut etterpå. Men det er litt kult hva du kan gjøre med node.js. Så jeg håper, generelt, dere har en god følelse av hva Node.js er nyttig for og hvordan du kan kanskje søke til det endelige prosjektet. Jeg skal sende ut noen mer ressurser sammen med dette. Og takk for at du kom. Takk. [APPLAUSE]