Va bene >>.
Così cliffhanger era, ciò che è Node.js come lo conoscete oggi?
Qualsiasi cosa? Sì?
>> Era come un quadro scrivendo JavaScript
Applicazioni In linea di massima -
>> OK, funziona.
>> - So che ti piace usi comuni, come -
o qualcosa che può fare è come -
[Inaudible Osservazione]
>> OK bene.
Sì, così è un quadro.
Si tratta di un motore con la quale si in grado di eseguire codice JavaScript
sito del server.
Questo può significare la semplice delle cose
come scrivere una riga di comando script non in Python e Bash
o Ruby o PHP, ma solo in JavaScript sé
e avviandolo a lampeggiante prompt dei comandi.
Oppure si può effettivamente eseguire entro un server web.
E infatti all'interno Node.js stessa,
questo quadro è un mazzo intero di librerie tra i quali sono
in server HTTP integrato.
Quindi, si può effettivamente scrivere un server come vedremo
in un attimo, super facile da solo per capire un po '
di HTTP e TCP e le porte.
E si può generare un ascolto server web Apache, senza,
senza IIS di Microsoft.
Senza qualsiasi altra software installato,
si può solo generare questo e ascoltare la maggior parte qualsiasi porta
sul sistema che si è permesso di.
Così caso e punti, lasciami andare e aprire
questo esempio, server 0.js.
Quindi notare che la parte superiore del questo file, solo un mucchio
di commenti poco interessanti, e poi c'è una coppia
di linee rappresentativi di codice che vedremo recurringly.
Quindi, var HTTP ottiene richiedono "HTTP".
Così incorporata per Node.js ' infrastruttura è un intero gruppo
di moduli che sono in realtà solo biblioteche e tutto è in ordine
di spazio dei nomi con l'identificatore unico
come questo è "HTTP".
Così che, come in molti linguaggi come Java e C + +
e C, solo quando si importare o includere
o nel nodo di parlare richiede un modulo fa suoi bit.
E tutta la memoria richiede ottenere caricato
nella RAM e quindi utilizzati.
Quindi, è una sorta di carica questo librerie o moduli su richiesta.
Questo significa andare avanti e richiedono
per questo programma la libreria HTTP,
e si riferiscono a quella libreria da modo di una variabile denominata HTTP.
Ma questo simbolo a sinistra potrebbe sono stati chiamati nulla, foo,
bar, baz, non importa.
Quindi, a differenza di C + + e Java e C dove quando si richiede
o importare una biblioteca, è appena sorta
di diventa accessibile a livello globale,
I moduli sono Node.js più strettamente namespace.
In modo che proprio - tale funzionalità è accessibile solo momentaneamente
a titolo di questo nome variabile.
Non si può semplicemente avviare la metodi di tipizzazione che esistono
in giusto modo che è probabilmente buona,
perché allora lo spazio dei nomi non ottiene quasi ingombra
come in molte lingue.
Va bene, così ora come il comune suggerire, la creazione di un server HTTP
come Jonathan [ipotizzato ortografia] era possibile è letteralmente
semplice come chiamare il creare metodo server all'interno
del modulo HTTP.
Quindi, questo sta tornando il riferimento
a una sorta di server web.
Si è trattato di Apache, non Peso necessariamente pesante.
Questo è un po 'più semplice.
E ora, devo solo basta fare un paio di cose.
Quindi, prima, fammi scorrere fino in fondo qui
e saltare il gestore Metodo per un momento.
E notare questa riga di codice,
che server.on è significa essenzialmente Server -
ascoltare come nel codice jQuery,
ascolto per un evento chiamato richiesta
e basta prendere una supposizione che cosa devo fare
quando un evento di richiesta incendi nel server.
Sì?
>> Chiamare il gestore funzione.
Quindi, letteralmente eseguire l' codice che fa riferimento
da questa variabile ed effettivamente non una variabile simbolo qui,
ciò è che simbolo riferisce?
Beh, questo nome di funzionamento qui
e conduttore apparentemente prende due argomenti.
Perché due? Beh, se si leggere la documentazione non
per questo modulo particolare, si sarà detto che il gestore
che verrà richiamato sarà superato almeno due argomenti,
un riferimento alla richiesta,
e dentro di noi richiesta letteralmente significa richiesta HTTP.
Quindi, tutti coloro intestazioni HTTP che si potrebbe ricordare
dall'inizio del semestre o qualche classe prima
o esperienza come la ottenere la linea e la linea di accoglienza
e la linea User-Agent, tutto questo è incapsulato e più dentro
di questo oggetto richiesta.
E l'oggetto di risposta è ordinati per i dati in uscita.
Quindi, avete un riferimento a un oggetto che sta andando per consentire
per inviare informazioni al il browser con metodi chiamando
su quest'ultimo argomento chiamato Res per la risposta.
Ma questo potrebbe essere chiamato foo o bar, questo sono solo convenzioni.
Così ora, cosa faccio?
Ebbene, sembra che all'interno di questo super semplice server web
che sto attuazione, sono intenzione di fare quanto segue.
Ho intenzione di scrivere un HTTP intestazione con codice di stato 200,
200 significato OK, va tutto bene.
E poi, io vado di trasmettere a quanto pare.
Qual è il tipo di dati del secondo argomento a testa giusto?
>> E 'un oggetto?
>> E 'un oggetto con quante chiavi e valori?
Solo uno di ciascuno, a destra, un valore fondamentale della coppia.
Quindi, 'tipo di contenuto'.
E l'unica ragione Sto citando qui è
perché il trattino potrebbe essere confusa per un segno meno
o qualcosa di simile.
Allora, devo citare qui, singe o doppi apici.
Ma paradigma nuovo comune
in codice JavaScript è spesso apici in questi giorni,
colon e quindi il valore.
Quindi, questo è solo l' tipo cosiddetto mente.
Si tratta di un header HTTP che sta letteralmente andando
accontentarsi tipo trattino colon testo barra chiaro che sta succedendo
da inviare dal server al browser
in modo che il browser sa se per eseguire questo testo come Raw
o HTML o come immagine o un filmato
oppure un file flash o qualsiasi altra cosa.
Ora, dove posso effettivamente voglio inviare nel corpo della pagina?
Beh, basta con la lettura la documentazione
per l'oggetto risposta all'interno di questa biblioteca.
Vedo che c'è un diritto metodo e che prende una stringa,
forse altre cose, ma minimamente una stringa.
E la stringa è ciò che è sputare al browser.
In questo caso la sua super- semplice, il suo mondo ciao,
ma potrebbe essere opne staffa, html, chiudere la parentesi,
testa parentesi aperta, close staffa e così via,
questo potrebbe essere html Raw.
Ma stiamo mantenendo l'esempio semplice, semplicemente sputando
il più semplice dei tipi di mente che è probabilmente text / plain.
E poi Response.End solo significa chiudere la connessione
e inviare tutto quello che ho sorta di tampone all'interno
di questo oggetto indietro al browser.
Ho finito. Bene.
Così, l'ultima cosa Sto facendo qui
e questo è un po arbitrario e vuole essere fresco,
è che sto dicendo la Server al fine di ascoltare
su un certo TCP dalla porta di default.
Ricordiamo dall'inizio di classe che i servizi -
o in genere in modo univoco identificarlo dai numeri,
AD è il web, 443 è basato su HTTP siti web, 22 è SSH, 21 è FTP
e il 1337 è solo arbitraria ma è superiore a 1024
che significa il più sistemi, posso usarlo
senza bisogno di super- privilegi utente.
Quindi è solo conveniente.
Ma 8080 è in fuori - un comune uno, 8088, davvero qualcosa di grande
in migliaia come comune ma questo è solo più d'elite.
Va bene, allora cosa succede quando ho eseguito questo?
Beh, non mi basta visitare la pagina in un browser.
Questo file è denominato server 0.js.
Perché ancora una volta, Apache è ora fuori dal quadro
per la seconda metà del corso.
Se voglio web del server, ho bisogno di scrivere
e quindi eseguire il server web.
Ma si scopre che JavaScript sia sul lato client
e il lato server è un linguaggio interpretato.
Quindi, tutto quello che serve è un interprete.
Quindi E'- se insistono a correre nodo e poi server 0.js,
Mi può o non può vedere qualche uscita in funzione
su quali librerie ho incluso, nulla sembra accadere.
Ma lasciami andare a un browser e lasciami andare
allo stesso indirizzo IP dei miei clienti CS50.
Ma questo potrebbe essere solo come pure il mio Mac
o il mio PC e poi premi invio.
Che sembra in realtà come Apache.
Ecco come la directory quotazione abbiamo guardato
in nel primo tempo.
Allora, che cosa ho fatto di sbagliato?
Già.
[Inaudible Osservazione]
Esattamente, giusto?
Quindi, Apache è ancora in ascolto sulla porta predefinita 80.
Anche se potrei cambiare che, Ho potuto spegnere tutti insieme
ma è ancora in esecuzione.
Ma questi ragazzi possono certamente coesistere.
Ho semplicemente mettere colon 1337 e poi magari
o forse non una barra a alla fine per accedere a questa porta
che questo server è in esecuzione.
E ora vedo che ciao, mondo è tornato.
E posso colpire reload come tutte le volte che voglio,
è ancora servendo una pagina.
Infatti, se apro Chrome ispettore, andare a rete
e quindi ricaricare l'intera pagina,
notare che in effetti questo è stato la richiesta inviata.
Se guardo alla fonte Raw,
notare il mio browser invia tutte queste cose.
E poi la risposta dal il server era super semplice.
Vi è il 200.
Se non è troppo bassa sullo schermo,
vi è il tipo di contenuto.
E poi Node.js sorta di automatica
per me aggiunto la data e l' tutte le altre cose
che i browser di solito si aspettano.
Quindi, facciamo solo vedere un poco controllo di integrità.
Lasciatemi tornare al codice in-server 0.js e lasciami -
ogni volta che vado in il gestore,
lasciatemi dire console.log.
('Abbiamo avuto un visitatore!').
Non ho bisogno di ricompilare o qualcosa di simile,
è un linguaggio interpretato.
Così ora, lasciatemi tornare a nella pagina, ricaricare uno, due,
tre volte e andare Torna alla mia finestra.
E ora vedo questo.
Beh, questo è strano, Vedo sei linee.
Interessante web curiosità, perché ha fatto Ottengo sei richiesta non tre?
Sì?
[Inaudible Osservazione]
Già. Quindi, come si può conoscere il piccola icona stupido in cima
della barra del browser che un sacco
di siti web potrebbe usati essere una cresta di Harvard,
potrebbe essere un logo aziendale o qualcosa di simile.
Così, i browser in questi giorni sort
presuntuosamente di fare un richiesta HTTP aggiuntiva
a quasi ogni sito web che Si visita controllando se c'è
Per impostazione predefinita, un file chiamato favicon.ico
nella stessa directory il file che hai richiesto.
E se è così, si mette l'icona lì.
Quindi tutto quello che stiamo vedendo è esattamente questo.
E infatti, vediamo se ci può vedere questo piuttosto che di tipo
appena uscito, 'Abbiamo avuto un visitatore'.
Lasciami andare avanti e di uscita.
E so solo questo da guardando la documentazione.
C'è una proprietà all'interno di l'oggetto di richiesta chiamato URL
che risulta essere il percorso
che è stato richiesto nell'URL reale.
Quindi, se mi riavvia il server semplicemente eseguendo nuovamente nodo
sul server 0.js e ora non questo uno, due,
tre e torniamo qui.
Eccolo.
Slash è quello che ho - l'umano richiesto
in favicon.ico è ciò che il browser è
presuntuosamente richiedente.
Ma il punto non è tanta roba favicon
ma come è gestito il server.
Sì?
>> Perché ha a che essere qualche richiesta?
>> Perché ha a che - dalla natura di come funziona HTTP.
Quindi, HTTP può richiedere solo un file alla volta.
I browser possono essere intelligenti in questi giorni
e mantenere il TCP connessione aperta.
Se avete preso CS143 o in generale familiarità con la rete,
così è possibile ottenere guadagni di efficienza
mantenendo la rete socket aperto
nel fare HTTP multipla richieste serialmente su di esso
ma sono un file per ogni richiesta.
Quindi, se si visita qualcosa di simile -
Voglio dire, possiamo andare a la maggior parte delle eventuali siti web.
Se vai a - cerchiamo di tirare su ispettore di Chrome qui.
Si può ottenere riempire la maggior parte della pagina.
Vai alla scheda di rete e andare a www.cnn.com.
E quando si visita cnn.com, sua homepage -
il vostro browser piuttosto atrocemente fa - ancora contando.
OK. Almeno 289 HTTP richieste ancora e ancora.
E questo è il motivo per cui quando si visita siti web particolarmente gonfio,
sono lento a caricare causa di tutti
delle attività che stanno caricando.
Così, sembra che 298.
Ci potrebbe essere qualche Ajax succede a questo punto o qualche
delle attività sono solo bassa.
Così, ciascuno di questi è un richiesta individuale tornare indietro
e indietro, avanti e indietro.
Ed è per questo che in precedenza, anche se abbiamo una sorta di parlato
su di esso un po 'fantasiosamente dove si inserisce il tag script,
assolutamente libera differenza quando si ha -
si inizia ad avere un sacco del traffico e un sacco
dei file che vengono richiesti.
E ciascuno ciò rappresenta probabilmente un'immagine, un file multimediale,
un file JavaScript, File CSS o simili.
Quindi, siamo già a circa 4 megabyte solo
a guardare le notizie di oggi.
Buona domanda.
Bene.
Quindi, quali sono alcuni dei gli aspetti positivi però?
Destra, sappiamo come fare pagine web già con PHP.
E molti di voi sono venuti per la classe sapendo Django
e Python o rotaie con Ruby.
Allora, perché abbiamo bisogno di un altro linguaggio e delle infrastrutture?
Che cosa è node.js particolarmente bene, se si sa?
[Pausa]
Qualche cosa?
No? Sì?
>> Inoltro dei messaggi.
>> Quindi, l'inoltro di messaggi.
Ecco, questo è vero ed è vero per un motivo più tecnico
e che Node.js e davvero JavaScript è particolarmente
ben si adatta a asincrona codice,
se in base al quale si crea l'illusione
di fare di più cose contemporaneamente.
Quindi, anche se sono realmente accadendo in serie,
infatti nella maggioranza dei casi, JavaScript sia lato client
e lato server è thread singolo.
Che se si sta prendendo 161 o anche 61 significa che -
di questo programma sa,
l'interprete può letteralmente fare solo una cosa alla volta.
Ma questo non è l'ideale per qualcosa di simile a un server web
dove si potrebbe avere decine o centinaia o forse migliaia
di tutti gli utenti che tentano per accedere alla pagina web
Allo stesso tempo.
E tuttavia, che suggeriscono che il trattamento loro uno
dopo l'altro dopo l' altri soprattutto se alcuni
di coloro richiesta, come abbiamo visto sulla CNN potrebbe richiedere che serve
fino a 300 file prima di anche arrivare a l'utente successivo
che vuole vedere la dice notizia.
Node.js è più adatto per gli ambienti del genere.
Perché quello che succede è ogni processo in esecuzione lenta
come leggere un file dal disco o interrogazione di un database o di parlare
a qualche altro server di rete,
che tende ad avere la latenza, giusto?
Se hai preso 61 o 161 soprattutto tutto di questo tipo
dei servizi periferici tendono ad essere molto più lento
che fare nulla all'interno di la stessa RAM e la stessa CPU
dicono che in questo caso la server è effettivamente in esecuzione.
Ma che cosa è bella di Node.js è che si può -
JavaScript e più in generale è che si può fare qualcosa
e poi dire: "Hmm, questo sta andando
a prendere me pochi millisecondi o anche pochi secondi.
Lasciatemi sorta di bivio che off, " ma non è un vero e proprio processo.
E poi, quando è fatto facendo quel lento processo in esecuzione
come afferrare le righe da una database o lettura di un file. html
dal disco, sarà tornare a me piuttosto
di me dover aspettare per questo.
Così, per renderlo più chiaro.
Questo è il mio mezzo di rendendo questo più familiare.
Va bene, quindi questo è il Shake Shack in piazza.
Questa è una sorta di paradigma comune
per spiegare asincronia.
Questo è in realtà un buon esempio perché Shake Shack
e Burger Tasty sono notevolmente rallentare per quello che fanno.
Ma il punto è che sono veramente bravo a prendere ordini
e prendere i vostri soldi dopo che si attende per il vostro cibo.
Così, questo è in realtà una migliore disegno che l'alternativa.
Perché supponiamo si cammina in un negozio come questo e ha ottenuto
alla parte anteriore della linea e effettuato l'ordine e si desidera
di hamburger, come meglio posso raccontare, ci vogliono almeno cinque
o più minuti effettivamente ottenere un hamburger.
Quindi, sarebbe gentile di un modello di business cattivo
se mentre stai aspettando il tuo burger, Alice [ortografia assunto]
e Bob [ortografia assunto] e Charlie [ortografia assunto]
e tutti gli altri è in coda dietro di voi
e si sono letteralmente bloccando la linea di attesa per il cibo.
Così, ovviamente, a Shake Shack
e altri fast food posti non fanno questo,
fanno qualcosa di simile.
Ti danno un segnale acustico.
E che tipo di si invia il vostro cammino.
E ti chiamano indietro di rendendo questa piccola vibrare cosa
o flash per ottenere la vostra attenzione.
Quindi, questo è letteralmente ciò?
Qualcosa come Node.js fa.
Se node.js o JavaScript più in generale viene utilizzata
e il programmatore è abbastanza intelligente
a realizzare, "Sai cosa?
Qualunque cosa ho bisogno di fare il bene qui può prendere qualche numero
di millisecondi o secondi.
Sai una cosa?
Lasciami andare avanti e non chiamare sincrono -
"Cioè ragazzo blocco tutti gli altri in linea, "-
mi permetta di andare avanti e sorta di farsi da parte
e semplicemente chiamare me indietro
quando quella lunga corsa completamento dell'operazione. "
E richiamare naturalmente è alludendo in questo caso
una funzione di callback, un riferimento ad un mandrino di codice
che avranno eseguito quando il vostro hamburger è pronto,
molto simile a questa cosa avere un po ' tipo di funzionalità built-in
che entra in vibrazione o ronzio quando è il momento per voi
di essere richiamato a la parte anteriore della linea.
Allora, che cosa fa questo significa in termini reali?
Beh, dobbiamo lavorare il nostro modo.
Quindi, mi permetta di andare avanti e farlo prima.
Nel server 1.js, lasciami prima semplificare il codice
così possiamo fare piccoli passi verso un problema più convincente.
Questa è la stessa esatta programma che ho scritto prima.
Ma che cosa è cambiato?
C'è una sorta di lieve differenza sintattica
tra questo e Versione 0 un momento fa.
Quello che salta fuori a se vi ricordate?
Sì Cynthia [ortografia assunto]?
[Inaudible Osservazione]
Già. Così ora, abbiamo una linea della funzione viene passato dentro
Abbiamo deciso di eliminare del genere
di nome invano funzione del gestore.
Inutile solo dal fatto che prima anche chiamando in un unico luogo,
Non ho davvero bisogno di perdere tempo dando un nome
e rendendo più difficile leggere il codice cima a fondo.
Quindi, facciamo solo dichiarare inline è una funzione anonima.
E sto facendo altre due cose.
Sto facendo meglio uso di notazione del punto.
Così come in jQuery, un sacco di nodo metodi possono essere concatenati insieme.
In modo che una volta che hai finito chiamando qualcosa, non è necessario
aspettare per una nuova linea e chiamare un altro metodo,
si può solo catena insieme.
E in questo modo, possiamo davvero stringere questo.
Così, questo è letteralmente un server web in cinque linee
totale di codice a differenza del -
a differenza di quanto si potrebbe normalmente dovuto fare per impostare qualcosa.
Se vado in server di 2 ora, facciamolo.
In Server 2 - in realtà cerchiamo di tornare a quel server 2.
Diamo ora aprire async-0.js e affrontare il problema a portata di mano.
Quindi, prima, andiamo avanti e aperto
up asincrone-0.js nel browser.
Così async-0, lasciarmi andare al browser.
Hit reload.
E ora, questo è una specie di messaggio di errore.
Infatti sto vedendo un 500 in ispettore di Chrome.
Ma lasciatemi più precisamente chiedere ciao.txt.
OK. Quindi, questo sembra funzionare.
Così async-0.js non sembra servire qualcosa per barra.
Non ha il supporto di file predefinito.
Ma se esplicitamente chiedere ciao.txt,
che sembra essere di supporto.
Perché è così?
Beh, quello che ho passato qui
e fatto è implementato un super semplice server web
che dimostra dove asincronicità può essere utile.
E che è implementato come segue.
In primo luogo, sto usando il Modulo HTTP nuovo,
ma anche FS che probabilmente sta per?
In generale, in CS, file system.
File system OK.
Quindi via FS, file system.
Va bene, allora che cosa questo mi dà?
Funzionalità relative al file come sempre passati,
l'apertura dei file, la scrittura directory, directory di lettura
e tutto questo genere di cose.
Così ora notare, questo codice è la stessa di prima,
creare il server, passando in una funzione anonima.
Questa è una specie di arbitrario.
Questo non è molto web server sicuro.
In realtà, si potrebbe accedere la maggior parte qualsiasi file sul mio disco rigido
o sul server del disco guidare eseguendo questo codice
perché io sono solo alla cieca supponendo che io vado
per afferrare ciò che l'utente richiesto nell'URL.
E ho intenzione di prefisso con dot
così che io sono marginalmente essere al sicuro
dicendo qualsiasi file che possono richiesta deve almeno dall'inizio
nella directory corrente.
Naturalmente c'è una minaccia qui.
Perche 'se invece comprendere che cosa?
Nel loro percorso, possono gentile di aggirare anche questo.
Dot, dot, giusto?
Quindi, se l'utente appena messo dot, dot nell'URL, in teoria,
potrebbero iniziare a ricevere il mio - e dire file di password.
Quindi, questa non vuole essere garantito,
è destinata ad essere semplice.
Così qui, ho una variabile che è la concatenazione di punti
che è directory presente e l'URL della richiesta
che abbiamo visto prima è come tagliare o / ciao.txt.
Così ora, si ottiene un po 'più interessante.
In primo luogo, notare il fondo.
Sto ascoltando il stessa porta come prima.
Così il vero interessante il lavoro è dentro di qui.
Ogni volta che una richiesta è disponibile in natura
di questo codice, cosa sto facendo?
Sto chiamando il file Metodo di file di lettura del sistema,
passando il percorso che voglio leggere.
E ora, questo è ciò che è interessante,
questo è di attuazione nel metodo asincrono.
Non è possibile ottenere un rendimento valore dal file di lettura.
Infatti avviso, c'è espressione non di sinistra
a fianco di file letto.
Esso non restituisce un valore.
Piuttosto, chiama un callback funzionare quando è pronta
a dare indietro una risposta.
Così ancora una volta per essere chiari, considerando che in passato,
in molti programmazione lingue, se si voleva
per leggere un file caso al punto PHP,
file di sottolineatura ottenere sottolineatura contenuti,
si dispone di una espressione di sinistra Nel complesso il valore dopo -
prima del segno di uguale, questo significa che si sta assegnando
a tale variabile il rendimento valore di tale funzione.
Puoi farlo in node.js, ma in genere si hanno
per chiamare in modo esplicito sincrono versioni di funzioni come,
Penso che sia sync leggere il file o la sincronizzazione di file letti.
Ho dimenticato come si chiamarono.
E che possa dare un valore di ritorno.
Ma se questo file è in alcuni file system remoto
o il disco è solo naturalmente lento, potrebbe richiedere 10 millisecondi
o 2 secondi per quel file di venire effettivamente indietro.
Intanto, nessun altro web i visitatori sono stati serviti
dal vostro websit.
Stai bloccando.
Questo è ciò che si chiama bloccando IO, ingresso / uscita.
Ecco, questo è molto più intelligente.
Perché ciò che Node.js sta
fare al momento interpretazione è il seguente,
sta andando a chiamare il metodo file di lettura,
provare a uno fino al file chi ha un percorso specificato dal valore P.
E poi, se e quando è pronto di dare indietro i contenuti
del file P, si chiamerà una funzione la cui firma è
per convenzione seguente.
Due argomenti, il primo dei che è forse un oggetto Error,
E maiuscola, è un oggetto chiamato un errore o Null
se non c'è tale errore.
E il secondo argomento - prendere una congettura - sta per essere ciò?
Si chiama dati, ovviamente, ma che cosa sono i dati più concretamente?
>> Contenuti?
>> Il contenuto di ciao.txt nell'esempio ho tirato
nel mio browser di un momento fa.
Quindi, in altre parole per leggere il file e molti Node.js funzioni
come a non restituiscono valori.
Chiamano callback e passare
a quei callback cosa sarebbe sono stati tradizionalmente
valore di ritorno.
Il vantaggio di questo approccio è
che si potrebbe chiamare Leggere un file T0.
La funzione di callback potenza non essere chiamato un tick più tardi
per così dire a T, si potrebbe essere chiamato un T1000,
un migliaio di zecche più tardi.
Ma il punto è che la resto del codice in questo file,
se avrebbe subito essere eseguito mentre node.js
e mentre il file system figure come leggere
quel file e ottenere di nuovo a voi.
Così si crea questo -
così efficacemente l'illusione
di parallelismo pur lasciando processi in esecuzione più lenti non è
bloccare le cose importanti, la parte che manutenzione utenti.
Quindi, come possiamo gestire questa situazione?
Questo è molto comune paradigma di Node.js.
E non c'è modo solo per semplificare questa è la vedremo prima insieme.
Ho controllato se Errore non è nullo.
Quindi, se non è falso poi c'è stato un errore.
Non so di cosa si tratta, forse il file non esiste.
Non ho avuto autorizzazioni.
Il percorso è sbagliato.
Qualsiasi numero di cose potrebbe andare storto.
Per ora, ho intenzione di arbitrariamente restituire il 500
che è errore interno del server.
Qualcosa è andato storto.
Io non mi interessa per diagnosticare esso.
Quindi, facciamo solo dire l'utente si è rotto.
E poi, io vado fare res.end,
e questa è la notazione abbreviata.
Ricordiamo che lo scorso volta che ho fatto res.write
e poi ho fatto res.end.
Se si desidera solo inviare una riga di output,
si può semplicemente fare tutto in una volta con res.end con un argomento,
e che sta andando per inviare qualunque sia il messaggio di errore è
all'interno di questo oggetto al browser.
E 'stato abbastanza archi elettrici ricordare un momento fa.
Non ho idea di cosa significava a prima vista.
Ma quando ho chiesto un file che non esisteva -
oops, abbiamo bisogno di correre nuovamente il server.
Quando ho chiesto un file che non esiste, EISDIR,
quindi qualcosa in merito essendo directory,
se faccio un po 'casuale stringa lì,
a quanto pare questo significa che l' file non esiste nemmeno.
E questo perché il mio codice sta semplicemente dicendo di scrivere
fuori qualunque sia il Raw Il messaggio di errore è,
quindi non molto facile da usare ma almeno sto maneggiarlo.
Altrimenti, se non fosse un errore Qual sto facendo?
Stessa cosa di prima spiedo un 200 OK, una pianura -
text / plain tipo di mente e poi sputare fuori i dati.
Ed è per questo che sto ottenendo l' contenuto di ciao.txt che si è appena
per confermare se ho guardato a ciao.txt,
è letteralmente ciao, mondo.
E se ho cambiato questo ciao, mondo, salvare il file,
eseguire nuovamente il server, ricaricare la pagina.
Ora, ho quella versione.
Così, ho davvero solo reimplementata un server web
come è esistita per molti anni, ma con node.js.
Ma possiamo farlo ancora più pulito.
Lasciatemi apro asincrona-1.js.
Ora, noto sto aggiungendo un altro modulo questa volta,
a quanto pare il modulo percorso.
Ora, questa è una buona opportunità di guardare
a che la documentazione assomiglia.
Node.js è documentazione.
Come PHP credo sia piuttosto buono
e dritto in avanti.
Se vado a Node.js e Google e cercare il percorso node.js,
quello che vedrete solito è un link diretto a un URL
che ho messo qui un momento fa.
Quindi / api è il luogo ufficiale andare per la documentazione.
E quello che vedrete in alto
della documentazione ufficiale del nodo è tutti i metodi e
o proprietà all'interno di questo particolare modulo,
uno dei quali è chiamato aderire.
E unisciti è la funzione di supporto che sta per permettermi
per non perdere tempo con tutti i vantaggi.
Ed è il valore aggiunto bonus come si vedrà
dai moli è anche normalizza il percorso risultante.
Quindi, se l'utente o hai punti o puntini puntino o qualsiasi combinazione
di quei tipi di relativa sentieri, tra i pregi
del metodo è che unita sta andando a pulire tutta che fino
e vi darò una canonica percorso senza alcun
di tali punti o puntini puntino.
Quindi, è una buona cosa in generale per la sicurezza almeno
se si sta controllando la valore di ritorno che io non sono
in questo particolare caso semplice.
Ma volevo usarlo.
Così, ora creo il percorso di un poco più di programmazione
con path.join invece di concatenazione Raw.
Quindi, questo è un po ' più pulito di prima.
E ora mi accorgo di essere un po 'più intelligente piuttosto
che ciecamente provate a leggere il file,
Io vado a realtà chiamare fs.stat.
Quindi, se si ha familiarità
con basso livello C funzioni e C, anche PHP.
Un sacco di librerie hanno restituisce stat questa funzione
essenzialmente statistiche su un file, la dimensione del file,
le autorizzazioni, il nome e cose del genere,
e implicitamente anche se il file esiste o no,
e se si tratta di un file o una directory
o link simbolico o qualcos'altro.
Così ora notato, io sono chiamando fs.stat.
E poi a quanto pare, secondo alla documentazione,
Dovrei tornare in oggetto Error
o Null seguito da un oggetto statistiche.
Ma cerchiamo di controllare questo, node.js.fs.
Questo è il file documentazione di sistema.
Permettetemi di cercare statistiche.
C'è molto di più delle funzioni qui.
Oops, che stat sync, fs.stat.
Quindi qui, è asincrona Statistiche (2).
Che è significato, se si ricordare da pagine principali,
capitolo 2 della pagina principale,
questo significa che questo è letteralmente solo una implementazione nodo
del basso livello funzione di sistema stat.
Così, il callback ottiene due argomenti, errori e stat
dove stat è un oggetto fs.stats.
Quindi vediamo cosa questo oggetto si suppone per assomigliare.
Facciamo clic sul collegamento ipertestuale e vedo che.
L'oggetto statistiche contiene a quanto pare qualche metodo di supporto,
è il file, è directory, è un mucchio di altre cose.
E 'la "è" il file che mi interessa circa in questo caso particolare.
Così qui vado.
Se c'è stato un errore, quindi lasciatemi cauzione questo momento
e assumere.
Se c'è un errore, è stato probabilmente un file di 404 non trovato.
Potrebbe essere qualcos'altro
ma mi viene un po ' lazy qui solo per mettere a fuoco
sui dettagli più interessanti.
Ma per l'utente del finalità, il file non viene trovato,
se c'era alcun errore indicando il file.
In caso contrario, fammi controllare se il il file è effettivamente un file vero e proprio.
Quindi, se non è un file esiste.
C'è qualcosa lì, ma è probabilmente una directory
o forse un collegamento simbolico
o qualcos'altro che è funky sul file system.
In entrambi i casi, l'utente non dovrebbe vedere.
Così ora, sto solo andando a sputare
convenzionalmente 403 non autorizzato.
Ma ancora una volta solo una convenzione,
Avrei potuto usare qualcos'altro in teoria.
E poi, infine, mi permetta provate a leggere il file.
Quindi, mi permetta di scorrere verso il basso.
E ora notate è qui il codice può ottenere un po 'disordinato,
Noto che sto chiamando fs.readFile passaggio
nello stesso percorso, stesso callback come l'ultima volta,
quindi la versione precedente.
E poi se avrei trovato -
se io non lo trovo, Ho sputato fuori 500.
E se lo trovo, cosa Linea stiamo andando a vedere qui?
Stiamo andando a vedere i fs scrivere intestazione 200 probabilmente
e un res.end invio i dati effettivi.
Ma notare questo.
E questo non è dimostrativa dello scenario peggiore.
Ma ho questa chiamata stat qui che ho alcune cose.
Poi, ho un altro chiamata asincrona qui,
così più rientro.
Quindi, solo tipo di estrapolare se si potesse da qui.
Qual è il problema tende a presentarsi con il linguaggio come JavaScript
in questo ambiente dove non hai valori di ritorno
ma avete questi callback.
E, naturalmente, questo è solo una cosa stilistica il fatto
che tengo rientro.
Ma prendere questo a logico passo successivo.
Supponiamo che ci sono stati uno o altri due o tre funzioni
che avevo bisogno di eseguire tale erano per loro natura asincrona,
e pertanto solo tipo di tenere rientro per gestirli,
per gestirli, per gestirli.
Si ottiene una sorta di callback inferno come lo chiamano
dove il codice inizia per ottenere molto ampia
e francamente molto difficile da leggere.
Come è, posso sorta di appena dire che questo è una sorta di flusso
che ha questo tipo
di stilisticamente angolato cosa sta succedendo qui.
Quindi, questo non è ideale perché questo può molto rapidamente diventare
ingombrante, anche se due asincrona non chiama
un grande affare.
Così, potremmo evitare questo, giusto?
Potreste aver intravisto che Ho misclicked un momento fa.
Nella documentazione, si sa, sembra che ci sia statSync.
E statSync non tiene un callback come argomento.
Ci vuole solo la strada perché a quanto pare fa cosa?
Si restituisce un'istanza di fs.stats.
Quindi questa potrebbe essere la vostra primo istinto, giusto?
Soprattutto se le funzioni di callback
e asincronia è un poco di nuovo a voi, francamente,
l'approccio più semplice è probabilmente solo evitare il problema tutto
insieme, tornare a ordinare della programmazione stile CS101
dove si chiama la funzione o metodo, restituisce il valore,
chiamata di funzione restituisce il valore,
funzione, restituisce il valore.
E potrei usare quindi fs.statSync
che è letteralmente la stessa ma è una versione sincrona
il che significa restituisce il valore.
Esso non supera un valore a un callback.
Ma perché vorrei che probabilmente un soluzione ottimale a ricorrere
alle funzioni sincrone?
Sì?
[Inaudible Osservazione]
Esattamente, ci vuole molto tempo.
Stai solo rallentando tutto giù.
Perché tanto come Shake Shack o Burger Tasty, se ne sono sbarazzati
di quei cicalini e ti ha fatto, stare il cliente al fronte
della linea fino a quando il cibo è pronto prima ancora di prendere l'ordine
della persona dietro è ovviamente
attraverso put rallenta.
La gente comincia lasciando, si ordina di disegnare pacchetti.
È possibile effettuare un numero qualsiasi delle analogie qui.
Ma in breve, è probabilmente non è una buona cosa
per affari o per il server.
Codice in modo asincrono è generalmente buona, almeno
in questo caso, ma sicuramente inizia a causare qualche angoscia.
E infatti oserei dire quando prima di scrivere questa roba,
ci vorrà un po ' po 'di tempo per abituarsi.
Quindi, cominciamo a dotare con alcune librerie
e tecniche per rendere questo un po 'più facile.
Quindi, uno dei più comuni biblioteche sono biblioteche popolari
in questi giorni, questo uno chiamato async.js.
E come un sacco di node.js librerie o moduli,
questi sono tutti open source.
Quasi tutti vivono e si repository mozzo che è una specie
di diventare de facto luogo per memorizzare queste cose.
E poi c'è un intera infrastruttura
per l'installazione di queste cose chiamato NPM, Node Package Manager
che se si ha familiarità con EvanTube è gentile
di app simili o app.
Se avete familiarità con Red Hat e Fedora
come nell'apparecchiatura; è come yum.
Ma è un nodo - è un gestore di pacchetti solo
per questo particolare ambiente.
Quindi, possiamo scaricare e installare cose come la biblioteca asincrona
e anche un altro chiamato sottolineatura libreria o il modulo.
Ma questi fs per quanto, HTTP, percorso,
quelli sono tutti vengono integrato al nodo.
Quindi, se andiamo alla documentazione API, vi si può vedere che ha costruito
nel nodo che si ottiene gratuitamente un sacco di moduli.
Ma un sacco di gente simpatica su Internet hanno fatto decine
se non centinaia di altre biblioteche
a fare le cose meglio o diverso.
Quindi, diamo uno sguardo a come funziona questa libreria.
Così, la maggior parte di questo codice è identico per il momento.
Ho un percorso essendo creato sulla parte superiore.
E ora sto chiamando async.series.
Così la biblioteca asincrona, è solo una libreria che permette
per passare o rilanciare tipicamente di funzioni per ottenere chiamati uno
dopo l'altro solo per tipo di evitare che la questione rientri,
e in realtà solo il mentale angoscia che inevitabilmente sorgere
almeno la prima volta immergersi per questo da soli
con la programmazione asincrona.
Come in parte, se avete preso 161 e hai affrontato con le serrature
e sollevare le condizioni e tutti di che, codice asincrono
e un ambiente come Node.js è in realtà molto,
molto più semplice discutibilmente
che in realtà la scrittura codice multithreaded.
Ogni volta che avete codice multithreaded,
si hanno condizioni di rilancio.
Bisogna preoccuparsi due thread che contengono
per le stesse risorse disco o memoria.
La bellezza di JavaScript
in Node.js è c'è letteralmente solo thread,
il che significa che il browser
o il server può solo fare una cosa alla volta.
E 'solo a voi, il programmatore
di mantenere un modello mentale per come una sorta di coda cose
e capire come di ordinare il vostro codice.
Ma tu non devi preoccuparti in merito a sollevare le condizioni
in tutto allo stesso modo a Almeno con il codice Raw come questo.
Quindi, è un po ' difficile Grack qui.
Ma - Così mi permetta di aprirmi la documentazione per un attimo.
La biblioteca async.js che allo stesso modo è molto Googleable,
vive nella GitHub rinvasare come un sacco di loro.
Non credo che sia abbozzato, non lo è.
Lasciatemi scorrere verso il basso al Leggimi qui.
Così, la biblioteca async fornisce un intero gruppo
di metodi all'interno di esso.
Per esempio, c'è un metodo chiamato ciascuno,
che se clicco questo solo per vedere i suoi documenti per un momento,
questa è una funzione o metodo che ti permette di fare qualcosa
come un quattro ciascuno ma in parallelo.
Sono tutti succederà potenzialmente in parallelo.
E il metodo ciascuno è solo intenzione di tornare a voi quando tutti
delle iterazioni sono completi.
Quindi forse accadono uno dopo l'altro.
Idealmente, si verificano sostanzialmente in parallelo.
Ma il metodo non richiamarti.
Non Buzz la tua buzzer finché tutti
gli elementi che avete iterata hanno completato.
Quindi, è solo un bel modo
di evitare usando un semplice ciclo di quattro
ma in realtà facendo qualcosa in modo asincrono.
Ma ora più direttamente relative a questo esempio,
notare c'è questa Metodo di serie.
E lasciatemi tirare su una semplice esempio canonico.
Così il biblioteche asincrone, serie metodo accetta come implicita
le parentesi quadre nella matrice.
Quali sono i dati tipi di elementi
in questo array basati su un semplice esempio?
Questa è una serie di funzioni.
Quindi, in C, si sarebbe chiamata loro funzionano i puntatori.
In JavaScript, ci sono più fa riferimento alle funzioni correttamente
o funzioni anonime.
E questo significa solo, array
naturalmente sono ordinate da zero in su.
Così, hanno mantenuto un ordine che è buono
per una serie ', serie di cause Naturalmente mezzi di fare qualcosa
per non in parallelo.
Quindi, questo significa solo che questo funzione otterrà eseguita,
allora questo, allora questo uno, quest'ultimo, allora questo,
ma quanti ce ne sono
finché opzionale callback viene chiamata.
Così, notare il paradigma qui.
E anche se questo è una biblioteca del ragazzo,
è rappresentante del paradigma molto comune JavaScript
di nuovo con callback.
Quindi, notate quello che fate qui.
Nella prima funzione essendo approvata in via questa matrice,
è stato definito un anonimo funzione solo con la funzione.
Ma l'avviso che, apparentemente, in base a questa documentazione,
che funzione anonima dovrebbero prendere un callback discussione.
Che sta per essere un puntatore o un riferimento a una funzione
che si dovrebbe chiamare quando il il codice è pronto a restituire un valore.
Quindi, di nuovo, a differenza di appena programmazione tipicamente procedurale
dove siete abituati a tornando immediatamente valori
che una differenza con utilizzando una libreria come questa
in programmazione asincrona più in generale, è quando si è pronti
per restituire un valore da un database, da un file,
da un'aritmetica espressione, tocca a voi
per chiamare la funzione di callback.
E la cosa bella su questa biblioteca
se leggiamo i documenti è più accuratamente che,
se e solo se tutti l'area callback chiamata
senza un oggetto Error, sarà il tutto successo?
Quindi, in altre parole, se ci sono 2,
se ci sono 10 anonimi Funzioni
in questo array quindi in questa serie,
solo se tutti riescono,
sarà il callback opzionale finale essere considerato di successo?
Se qualcuno di loro , ogni funzione fallisce
dopo non lo farà anche essere eseguita.
Quindi, è un bel modo di sorta di avere una daisy chain
che abortisce prematuramente se qualcosa va storto.
Quindi, per vedere questo nel contesto, qui è come potremmo implementare nuovamente
che programma precedente.
Ottengo il percorso come prima, quindi questa è la parte facile.
Copio incolla questo codice skeleton
dalla documentazione lì async.series parentesi aperta,
aprire parentesi quadra.
E ora notare ho uno funzione in questo inizio
di un secondo, vedremo dove andiamo da questo.
E ora notare, si tratta di un po 'complessa in un primo momento
ma concentrarsi solo sulla riga per riga.
Fs.stat significa ottenere le statistiche o ciò non di quel percorso.
Chiamare questo callback quando è pronto.
Questo codice è la stessa di prima.
Se c'è un errore, c'è una differenza ora.
Ancora una volta, il paradigma molto comune nella programmazione Node.js è
se qualcosa va storto e un callback deve sapere
che per convenzione, il primo argomento di un callback sta
esserci, se tutto va bene o un riferimento a un oggetto Error,
capitale E. E 'come un errore classe che esistono a livello globale
ma più su quello un'altra volta.
Così facendo, se c'è un errore, qual è l'implicazione?
Beh, in base a quello che ho ha detto che la serie fa,
è che se qualcosa va sbagliato, abbiamo solo tipo di desiderio
per annullare tutta la serie funzione di chiamate anonime.
Quindi, è sufficiente per me basta tornare callback passaggio
in oggetto Error.
Perché se stat dato mi riporta un errore,
Potrei creare un nuovo Oggetto di errore della mia,
ma non mi importa di,
Voglio solo passare qualunque sia il errore è che effettivamente accadere
così posso passare a questo callback.
E tanto per essere chiari, l' ritorno non è strettamente necessario.
Io essenzialmente voglio fare questo ma volevo ora non "ritorno;
/ / Modo che non più qui il codice viene eseguito ".
Quindi, di nuovo un altro comune convenzione in JavaScript,
anche se non siete restituendo un valore di per sé,
si vuole passare il valore alla funzione di callback
ma poi si vuole per fermare l'esecuzione
della funzione di sei in, modo banale
per fare questo è solo per chiamare tornare qui.
Ma non c'è nulla di sbagliato,
stiamo solo facendo ritorno callback errore anche se sta andando
per tornare in valore indefinito.
Va bene, questo non restituire un valore più probabile.
Tutto quello che interessa è un imbarco ulteriore esecuzione.
Quindi, la mia fusione di questi due linee è solo uno stilista
la convenzione solo per avere il numero di riga
del codice che ho appena scritto da 2 a 1.
Quindi, che cosa?
Se non c'è un errore -
in realtà per essere chiari Potrei anche evitare
che, così facendo, se altra cosa.
Ma ancora una volta, un altro paradigma comune di controllo
per i vostri errori fino in cima e poi appena di ritorno piuttosto che continuare
per far rientrare il codice con altre famiglie e altre famiglie e altre famiglie.
Quindi, se non è un di file, ora, si sa,
Voglio gestire questa un po appositamente.
Quindi, qui come in Java o C + + o alcune altre lingue,
ecco come creare un'istanza di un opporsi al tipo di errore di passaggio
in un messaggio predefinito non un file
e questo è solo un po 'arbitraria.
Ma sto segnalazione un errore della mia.
E cosa fa questo ultimo linea presumibilmente significa?
Tutto è bene.
Se si passa null per l' parametro di errore, che proprio dire
per convenzione va tutto bene.
Quindi, ciò che significa accadrà logicamente?
Se viene passato nullo al callback
che significa che questo anonimo funzione è riuscito
per così dire.
Allora, che cosa dovrebbe la serie Metodo precede e ora ne riferiscono
Mio definizione verbale prima?
[Inaudible Osservazione]
Passare alla prossima, giusto?
Se fosse restituito un non nullo valore, sarebbe solo abortire
e non più anonimo funzione otterrebbe chiamato.
Ma perché ha no, allora questo verrà chiamato il prossimo.
Quindi, la logica ecco più o meno la stessa di prima
e vedremo come pulire questo ulteriormente in un attimo.
Mi rendo conto che è una specie di sacco
assorbire tutta verbalmente e visivamente.
Ma ora notare, la seconda funzione anonima che voglio
eseguire in serie è per cercare di leggere il file.
Chiamare questo callback quando sei pronto.
Se c'è un errore, basta segnalarlo a titolo di callback
in modo che il resto questa roba si interrompe.
Else nullo ritorno.
Ma perché sto passando in due argomenti?
Beh, questa volta se leggo il file e tornare
come variabile chiamata dati,
Voglio significare non solo tutto è bene restituendo nullo
per il primo argomento.
Voglio tornare l'attuale dati come secondo argomento.
Perché se leggo un ulteriore nella documentazione,
notare questo ultimo pezzo di codice parentesi quadra significa che è il
fine della serie.
C'erano solo due anonimi funzioni in questa serie.
Se si è verificato un errore qui, allora So che uno dei link
in questa catena così a parlare fallito.
In altre parole, questo errore sta per essere un oggetto Error
che è nullo se di questi ragazzi non è riuscito.
E se questo è il caso, io sono solo andando a tirare fuori dai guai e ho intenzione
a dire 400 che significa richiesta di fallire,
che è molto generica messaggio di errore.
E poi, ho intenzione di stampare il messaggio di errore.
Quindi, non sto preoccuparsi di essere super anal questa volta,
Non ho intenzione di distinguere tra 500 e 404 e 403,
Sono solo tipo di ciecamente onda la mia mano
e dire qualcosa è andato storto.
Ma se non ha fatto andare storto,
Ho intenzione di inviare questo res.end passando questi dati.
Ora, questo sembra un po 'criptico.
Ma ancora una volta se leggo la documentazione,
il secondo argomento questa finale, richiamata finale,
il ragazzo che viene eseguito solo una volta che la serie è fatto
esecuzione o una porzione di là di, questo sta per essere una matrice
di tutte le seconde argomenti
che sono stati passati al callback.
Ora, si scopre che l' collegare solo in questa serie
che in realtà tornare al secondo argomento è questo qui.
Quindi ho intenzione di ordinare di un salto di fede è sufficiente utilizzare supponiamo
per il momento che ultima è un metodo
che ti dà l'ultimo elementi di un array.
Perché questo array che viene passato
a me ha due indicies, zero e uno.
E 'solo lo zero non ha alcun valore perché questo ragazzo restituisce -
non passa in un secondo argomento, ma questo ragazzo fa.
Così risulta staffa zero è niente,
uno dei risultati staffa contiene ciò che,
se avete seguito lungo fino a questo punto?
Il file, ciao, contenuti mondo presumibilmente,
è così che ho effettivamente stamparlo.
E lasciami finire Un dettaglio qui.
Se faccio questo tipo di vecchio scuola, se voglio arrivare
agli ultimi elementi, se potessi fare risultati [results.length-1],
che è una sorta di strada vecchia scuola
di accedere gli ultimi elementi in - o array di indice zero.
Ma come nel lato, ricordare che ho avuto questa biblioteca
qui sottolineatura che, per convenzione è appena chiamato
letteralmente un trattino carattere che non è speciale,
sembra proprio fresco come il segno del dollaro fa per jQuery.
Questo è solo un aiuto Metodo di sottolineatura dot scorso
che fa esattamente la stessa cosa.
E se non hai mai usato prima sottolineatura JS sia
per la codifica lato client
e lato server è biblioteca meravigliosamente utile
che come molti descritto è come jQuery contiene tutte
dei metodi, la gente ha voluto è venuto con JavaScript stessa.
OK.
>> Così, come abbastanza per me e Stavo guardando nella serie,
avete come callback come argomento?
Sì >>.
Come >> così quando si in realtà come spinta che in,
e come quello che lo fa significa che quando avete appena
come callback e poi fare come -
[Inaudible Osservazione]
>> OK, buona domanda.
Quindi, mi permetta di tirare il async pagina principale qui
o la documentazione su GetHub.
Quindi questa è la canonica struttura.
Se stai chiamata utilizzando questa serie particolare metodo,
ci sono due grandi parti di esso.
Uno è un array di funzioni anonime
e due è un callback finale funzione che in realtà è
eseguito per lo fine della serie.
Ora, se ci focalizziamo in un po 'più vicino al primo
di quelle grandi cose, la gamma di funzioni anonime
dal requisito di questa documentazione del ragazzo ha
essere un anonimo funzione che prende
in un argomento chiamato callback o foo o al bar, non importa
ma lui chiamandolo callback.
E questa è una sorta di vostro buzzer che Shake Shack ti porge.
Questo è il mezzo con cui è possibile restituire un valore
al cliente perché si non può solo che letteralmente ritorno.
Devi farlo senso di questo callback.
Perché se all'interno di questa funzione è un po 'lento in esecuzione
codice come database di query, leggere il file dal file system,
non si vuole aspettare lì e bloccare tutti gli altri,
che si desidera chiamare il callback.
Così, questo è letteralmente il nome dell'argomento.
Ma come in C, è avere puntatori a funzione.
In Java si ha metodi del sistema di riferimento
e lo stesso qui in JavaScript.
Questa è una variabile ma il suo tipo è funzione.
Così, semplicemente scrivendo il suo nome se un callback o foo
o al bar, poi parentesi aperta e parentesi chiusa,
si sta eseguendo che su tale funzione.
E passando un nulla che mezzi errore nullo e uno
che significa che questo è il dati che voglio passare dentro
E poi il pezzo per essere chiari, questo è un altro callback.
E non è chiamato callback,
solo concettualmente è un funzione di metodo di callback
perché è chiamato per definizione
della biblioteca di questo autore quando l'intera serie ha completato
o sottoinsieme se un errore è accaduto prima.
Così, il nome della funzione di callback, chiamata funzione di callback,
nome della funzione di callback, chiamata funzione di callback,
diverso callback funzionare tutti insieme.
>> Ora abbiamo come definire callback?
>> No, perché questo ragazzo passerà nel vostro matrice
funzioni di anonimi,
un puntatore al codice vuole eseguire.
Esattamente, tutto bene.
Quindi, per favore dire che la codice diventa un po 'più semplice.
Quindi, si può.
E se siete come me, prendi conforto in almeno conoscere,
ci vuole un po 'per abituarsi a questo.
Ma possiamo pulire questo un po ',
non gettare troppo a voi ma qui è un'altra variante
e la sua utilizzando un altro metodo
nella stessa libreria chiamato cascata.
Il vantaggio di cui è diversamente serie dove ogni
Di quelli anonimo funzioni eseguite essenzialmente
indipendentemente ciascuno degli altri.
Cascata come il nome suggerisce consente le funzioni più alti
per passare tipo di valori alla funzione inferiore,
Un po 'come una cascata d'acqua.
Così il rialzo di questa è che posso tipo
di usare questo a mio vantaggio.
In async.waterfall, notare quanto segue.
Posso solo chiamare fs.stat passando il percorso
che voglio ottenere statistiche su.
E poi ricordare prima di ha avuto una funzione anonima
che aveva due argomenti sbagliano,
isultati e poi ho chiamato il funzione di callback manualmente?
In altre parole è solo per essere chiaro, ricordare che in precedenza
in async 2, ho fatto tutto di questo lavoro brutto.
Ho chiamato fs.stat passato in P,
dichiarato il mio anonimo funzione.
Poi ho controllato se l'errore è non nullo allora ho fatto questo,
altra cosa ho fatto, l'intero bellezza della sequela convenzioni
come in Node.js è che callback funzioni in generale sono destinati
di prendere almeno un argomento, un oggetto Error seguito da zero
o valori più utile.
Così notare il paradigma qui,
questa funzione di callback sono dichiarando segue esattamente la
paradigma che di questo ragazzo biblioteca async fa.
Che è dire questo, perché sono Ho attuazione mia callback
metodo quando l'autore di questo biblioteca è letteralmente porgendomi
su un piatto per così dire, un funzione di callback posso usare?
Quindi, posso solo passare il riferimento che mi ha dato
così che subito, le mie diverse linee
di codice diventata una riga di codice.
Ora, dove andiamo con questo?
La prossima funzione che Voglio eseguire,
il successivo anonimo funzione in questo array
di funzioni fa il seguente.
Avviso prima è stat il primo argomento.
Quindi qualcosa deve già cambiato.
Ora, questo ragazzo che ha scritto la biblioteca -
e io sto dicendo ragazzo perché è un ragazzo.
Questo ragazzo che ha scritto questa biblioteca è documentazione garanzie
che se questa funzione qui mi passa indietro un oggetto Error
o nullo seguita da coma elenco separato di altri valori,
egli farà in modo che i altri valori sono handed
a questa funzione anonima in ordine da sinistra a destra.
E quello che era solo un funzione di callback da solo semplicemente
diventa l'ultimo argomento del genere.
Ora, io non so chi sono concentrandosi su un solo sai.
Ma ora, qual è il da asporto qui?
Così, sappiamo da la documentazione
o la coppia prima di esempi
che fs.stat aspetta alla fine una richiamata con due argomenti,
l'oggetto Error che è un Oggetto Error o nullo seguito
da un riferimento a oggetto le statistiche.
Quindi, se penso che, Oggetto Oggetto Errore statistiche coma,
che si inserisce nel paradigma della biblioteca di questa persona.
Quindi, posso dire semplicemente perché I NO il secondo argomento
che è - che sta andando per essere passato da fs.stat
al callback è err, stats per definizione di questa biblioteca,
Posso mettere la seconda Il nome di argomentazione qui
o qualsiasi altra cosa che posso rinominarlo
se voglio seguito dal callback qui.
Quindi, posso passare una valore da qui a qui.
Ora, tutto questo codice però certamente un po 'criptico è
almeno il copia incolla per la maggior parte dalla prima.
L'unica differenza è l'avviso qui sto dichiarando un errore
oggetto e ora voglio per ottenere un po 'più elaborato.
Io in realtà voglio sapere che cosa l'errore è stato, quindi sto andando
infilare all'interno di questo oggetto un struttura arbitrariamente chiamato codice
in modo che io so che questo non è un file
che dovrebbe essere autorizzata, è un HTTP 403.
Permettetemi di ricordare che prima Io passo l'oggetto Error
al callback.
E poi, infine provare a leggere il file, quindi in questo caso,
la cascata, ho rotto il codice di due grandi passi
in tre piccoli passi.
Notate la bellezza qui,
Posso chiamare fs.readFile passando il percorso.
E poi la parte più difficile mentalmente, è ho solo passo
nel callback del ragazzo.
La cosa mi sta consegnando, sono intenzione di passare a fs.readFile.
Perché siamo tutti aderenti per le stesse convenzioni,
primo argomento di un callback è un oggetto Error o nullo seguito
da un coma o separato elenco delle cose utili.
Allora, che cosa significa adesso e se io leggere la documentazione saprò
questo, l'ultimo richiamata, questo tizio qui fuori
le parentesi quadre sta per essere passato in oggetto Error
o nullo che dovrei controllare per come sempre con questo codice qui.
Quindi per definizione di questo metodo
nella documentazione del ragazzo, l'ultimo valore restituito
dall'ultimo metodo nel mio array anonimo -
la mia serie di funzioni anonime.
Allora, che cosa fa leggere file di ritorno
e sto usando un ritorno liberamente adesso.
Voglio dire ciò che leggi passare il file come argomenti
al metodo di callback la sua mano?
Due argomenti, prima è un oggetto Error o nullo,
che è quasi sempre sta per essere la risposta.
E la seconda cosa sta succedendo di essere ciò che per file di lettura?
I contenuti del file, dati che abbiamo chiamato in precedenza.
Così, semplicemente dichiarando err, risultato,
e controllare questo errore è una sorta di noioso ora.
Altrimenti, lo faccio res.end passando tale risultato.
Questo sarà senza dubbio Non sincronizzare perfettamente
fino a che realmente scrivere voi stessi.
Ma per ora, prendere via almeno il fatto
che c'è a quanto pare questo paradigma comune, per cui se si
e gli autori di biblioteche ogni sorta di bastone
con questa convenzione di metodi di callback.
E il primo argomento è un oggetto Error o nullo.
E il secondo e terzo
e quarto oggetti sono cose ci preoccupiamo e ci ordinamento
di seguire le regole e documentazione.
Abbiamo iniziato con il codice che Onestamente è abbastanza brutto.
E anche se la più recente esempio è francamente un po 'difficile
per avvolgere la mente intorno, è, almeno visivamente,
sembra che sia molto più rigorosa.
E una volta che si ottiene comodo con essa, è molto più facile
ed è molto meno incline a bachi da quella dell'esempio precedente.
Quindi, mi permetta di dimostrare un'ultima cosa qui.
Questa è la versione tre.
E - No, lasciamo solo questo.
Lasciami andare in un paio di altre ultime cose come teaser.
Va bene, così nel server 2.
OK. In primo luogo, tutte le domande, So che questo è molto
ma si voleva più istruzioni così?
Non hai detto bene istruzione necessariamente.
Sì?
[Inaudible Osservazione]
Esatto, sei essenzialmente indulgente al sistema operativo
per capire come destreggiarsi tutte queste palle contemporaneamente,
la lettura da un file, lettura da un database.
Ed è questo server JavaScript sé che è a thread singolo.
E sostanzialmente ed effettivamente,
c'è una foto Io non vomitare,
e non è necessariamente tutto questo illuminante
ma forse daremo un modello mentale.
JavaScript stessa e nodo
in particolare ha questa cosiddetto ciclo degli eventi.
Per cui, si può pensare di node.js, il programma,
è letteralmente come un ciclo infinito.
E 'solo un ciclo selvatico, in attesa e in attesa e in attesa,
Per informazioni sulle attività da completare.
E il compito potrebbe essere, andare prendere qualcosa da un database
o qui è un valore dal database o andare a prendere questo file
da disco o qui c'è un richiesta da un utente.
Qualsiasi tipo di evento, proprio come l'evento browser guidato,
così come il server side event driven.
E nessuna di queste cose costituiscono eventi.
Così qualcuno in node.js, basta ha scritto un ciclo infinito,
un grande anello selvaggio, in attesa per le cose che accada.
E come roba accade, finisce in una coda, giusto?
Certamente, un database potrebbe restituire un valore.
E un file system, il sistema operativo sistema potrebbe restituire un valore
più o meno allo stesso tempo ma c'è probabilmente andando
essere qualche ordine per loro.
E Node.js sta per hanno essenzialmente una coda
come un grande array o una vettore, qualche struttura dati
che memorizza tutti di queste cose.
Perché si può letteralmente solo gestire uno alla volta.
Così, quando, lo sviluppatore,
la scrittura asincrono JavaScript codice utilizzando asincrono
funzione, si sta permettendo questo cosiddetto ciclo di eventi per andare
al prossimo zecca, giusto?
Quindi, fintanto che subito di ritorno, tutti
di questi metodi asincroni fare come file di lettura e stat,
tornano subito perché il callback casualmente
ottiene indietro.
Appena si torna,
questo significa che qualcun altro può ottenere spuntato fuori dal magazzino qui
o che si può ottenere spuntato fuori davanti alla coda qui.
E così, c'è in Infatti la serializzazione
di tutto ciò che sta accadendo,
anche se tutte queste cose può accadere in parallelo
su un sistema multithreaded.
Ma se stesso e Node.js il server fosse in esecuzione
come un thread.
E il lato negativo di questo è t non necessariamente max
il vostro computer capacità è particolarmente
se si dispone di un nucleo di 16 o anche un computer 2 nucleo
e si sta solo eseguendo una istanza di nodo.
Ma se avete ancora preso qualcosa come 161,
si evita un enorme incubo di mal di testa quando si tratta
alle condizioni di gara e serrature e semaforo
e scrivere veramente l' codice multithreaded,
così aspetti positivi e negativi.
OK. Quindi, tornando al codice qui, lasciatemi Propongo che si cominci
per semplificare le cose un po '.
Abbiamo visto un server un po ' fa che sembrava tale.
Quindi, questo è probabilmente piuttosto semplice.
Ma proprio come nel mondo di PHP, ci sono quadri
come Laravel e c'è cose come Rails e Django,
stessa cosa nel mondo node.js.
E passeremo più tempo su questo il Mercoledì
e nel successivo progetto.
Ma se vado in un directory del server 2,
notare un paio di paradigmi qui.
Quindi questo è - c'è in corso essere un esempio equivalente
ma che sta utilizzando un framework chiamato express.js,
che è gratuito open source software come Rails e Django,
come Laravel, che è solo in ultima analisi, andando
di essere incompreso oggi Perche 'stiamo scrivendo
questi semplici esempi.
Ma fiducia in noi.
Questo sarà molto rapidamente diventare tuo amico
perché farà risparmiare un sacco di codice TDS.
E un paradigma comune per un'applicazione express.js è
Per avere un app.js o server.js file che contiene la logica
del programma o almeno il punto di ingresso.
È possibile avere più file.
Un modulo nodo sottodirectory che ha le librerie
che hai scaricato come async
ed esprimersi in altri.
E poi package.json, package.json assomiglia a questo,
ed è possibile creare manualmente o strumenti creano per voi
ed è letteralmente un file JSON
e la parte interessante sono le dipendenze qui.
Proprio come in Laravel, è avuto quella directory vendor
e si doveva preoccuparsi sui pacchetti e facendo -
in realtà aggiornamento con Artigiano o comandi simili,
le librerie hanno installato,
analogamente, con package.json qui e gestire le librerie
e le versioni che vi preoccupate.
Quindi, se ho un package.json, Posso semplicemente fare NPM,
Node Package Manager installare, è andare a guardare automaticamente
a quel file package.json.
Guardare e vedere, faccio avere l'ultima versione
di tutti i moduli fornitori
in un nodo sottolineano moduli Elenco qui o forse
in qualche genitore o Elenco antenato.
E se non, è andare a scaricarli
e vedrete un intero gruppo
di roba HTTP andare attraverso il filo.
Così, per esempio, mi permetta vi mostrerà il contenuto
di moduli nodo solo esprimere.
Lasciami andare avanti e arditamente eliminare moduli nodo
in modo che tutto quello che ho adesso è questo.
E se io installo NPM, ti vedere che sta andando a leggere
il file package.json e abbiamo visto un output simile
per questo nel mondo Laravel.
E 'il download di un intero mucchio di cose e questo è
perché espresso a sua volta dipende da un sacco
di altre biblioteche popoli.
Quindi, tutti questi sono specie di essere stato scaricato in modo ricorsivo.
Fino ad ora, se lo faccio in LS di nuovo,
ci sono i miei moduli nodo Elenco indietro
ed esprimere come back.
Quindi è solo un modo di semplificare la gestione dei pacchetti.
Ora, se guardiamo al file di app.js, questo sta andando
per essere un ritorno alla il nostro server web prima
dove abbiamo appena sputato out "ciao, mondo".
Ma bando i paradigmi qui,
in primo luogo si richiede l'espresso modulo, allora abbiamo questa linea
di codice che sai dalla documentazione.
Si può letteralmente tratti che variabile del modulo in funzione,
così aperta parentesi vicino parentesi significa eseguirlo.
Quello sta andando apparentemente restituire qualcosa che stiamo andando
generalmente chiamare un app.
Come funziona?
Io non lo so davvero.
Lascio qualcun altro, si sa, nel mondo espressa scrivere che.
Sto per ora stare su sue spalle così come
per fare la mia domanda esecuzione di un po 'più semplice.
Qui, ho intenzione di ascoltare su quella particolare porta
che potrebbe essere qualsiasi cosa.
Ed ecco il codice che è forse ricorda più ora
di Laravel e routes.php.
Quindi questa è la cena semplice, io sono solo andando a specificare un percorso
per la barra stelle, quindi tutto sta per essere assorbita
da questo gestore richiesta.
Il paradigma per la richiesta del gestore è la sua funzione anonima
con un argomento richiesta
e un oggetto risposta proprio come prima.
E res.send nei mezzi espressi si invia il codice di seguito
da tutto ciò che si desidera inviare.
E, naturalmente, è possibile fare qualcosa di più elaborato
da inviare effettivamente file o HTML
o generati dinamicamente contenuti.
Ma per ora, tutti abbiamo fatto è stato sputare ciao, mondo.
Se andiamo in server di tre, questo è ancora più elaborato solo
visualizzare alcune funzionalità.
E vi mostreremo un versione ancora più sexy
di questo il Mercoledì.
Ma se avete mai sentito di Socket IO forse,
così come penso Jonathan o qualcuno ha detto in precedenza,
una delle cose nodo è davvero conosciuta
è il suo tempo reale comportamento, giusto?
Pensate PHP a MySQL, se erano per implementare un server di chat
in PHP con il quale due persone potrebbe aprire una finestra del browser per foo.com
e quindi avviare IMing ogni altra, Alice in una finestra,
Bob in un altro modo che ciascuno di essi vede suo
o suoi messaggi in l'altra finestra.
Come si potrebbe fare questo in PHP e MySQL?
Utilizzando o non utilizzo Laravel liste di immateriale, si può avere
come un file index.php.
E devi avere - in alcuni casi è arrivata a sputare
fuori forma, quindi non c'è sta per essere un modulo HTML
che probabilmente non sostiene via normale modulo di presentazione
ma probabilmente Ajax, giusto?
Quindi, un on presentare handler, così si digita in un campo di testo,
si colpisce entrare e poi ottiene inviate al server tramite Ajax.
Quello che fai, allora fare sul server?
Quindi, hai index.php
o qualcosa dot PHP che è ha ricevuto nel parametro HTTP
da parte dell'utente, Alice o Bob messaggio istantaneo, cosa fai
con esso in modo da propagare a Bob e Alice, rispettivamente?
Ti voglio dire letteralmente avere gli strumenti con i quali
per fare questo nella vostra min.
Così come quello che faresti?
Hai un minuto per implementare questo programma.
Sì?
[Inaudible Osservazione]
Perfetto. Giusto, quindi hai un database.
Conosciamo un po ' po 'di MySQL.
Quindi, avete una tabella ecco i messaggi,
forse c'è volte timbro, un ID utente,
il corpo del messaggio stessa creato che,
aggiornato che e tutto questo.
Quindi, si memorizza in un database.
E supponiamo che Alice invia il primo messaggio, come fa Bob ottiene
quel messaggio ora dal database?
>> Potrebbe essere un po 'Ajax risposta che sta andando costantemente
al database top ottenere il [incomprensibile].
>> Esattamente.
Quindi il codice di Bob che è il codice è la stessa di Alice è proprio ordinamento
di una relazione simmetrica,
Il browser di Bob ha qualche codice Ajax che probabilmente è forse ogni 30
secondi tirando la server tramite Ajax sync,
ci sono nuovi messaggi?
Ci sono nuovi messaggi?
Ogni 30 secondi sta ad essere una sorta di sub-ottimale
perché deve aspettare ancora
se Alice letteralmente appena inviato il messaggio.
Così, browser di Bob potrebbe ogni secondo ha colpito il server.
Ma questo significa che Alice il browser sta colpendo il server
ogni secondo.
Che dire di Charlie [Ortografia assunto]
e David [ortografia assunto] e Edward [ortografia assunto]
ed ogni altra lettera dell'alfabeto?
Qual è il problema di questo approccio?
Un sacco di colpi eccessivi -
Voglio dire, sei solo efficace DOSAGGIO la tua vista
o DDOSing, Distributed Attacco denial of service
sul proprio sito, avendo tutti
di questi utenti eseguire JavaScript codice che è solo il ping sul
diamine fuori del server anche se il numero arbitrario,
80 per cento del tempo nessuno ha detto niente
nella chat room.
Ma si sta solo controllando per assicurarsi di tale.
Quindi PHP in un sacco di le lingue non sono solo buoni
per le comunicazioni in tempo reale.
Perché in PHP richiamo c'è nessuna memoria centrale, giusto?
Avete oggetti sessione che crea l'illusione
di stoccaggio centrale ma che è su una base per utente.
Non si dispone di memoria globale come si fa in un Java Servlet
in familiare o in altre telaio funziona così.
Node.js, però, si ha memoria globale perche 'hai
un server e che 'può ricordare tutto ciò che vuole
su tutti gli utenti.
E si potrebbe ancora avere un database.
Ma la cosa bella di node.js troppo è che è molto meglio
di qualcosa come PHP e creando l'illusione
di gestire più cose contemporaneamente.
E infatti, come in parte, è possibile implementare server di chat in PHP,
ma è in genere fare qualcosa chiamato polling lungo
per cui non un rumore metallico il server ogni secondo.
È il ping del server, il server non risponde a voi
per più di 30 secondi, si siede letteralmente
in un ciclo di attesa e di attesa.
E i controlli server se ci sono nuovi dati nel database
e solo una volta che ti vede, "Oh, ecco un messaggio da Bob, "
Non mi risponde al server HTP?
Così l'effetto nel tuo browser è che l'icona di Internet Explorer o Mozilla
o qualsiasi altra cosa mantiene semplicemente la filatura per 30 secondi alla volta.
Ma il vantaggio è, non lo fai avere 30 richieste di connessione
in 30 secondi, ne hai uno.
Così si chiama polling lungo.
Ma ancora meglio nel web moderno browser è qualcosa che si chiama
WebSocket, che si prende il CS143,
si può effettivamente fare un Connessione TCP da un client
come un browser a un server e poi appendere ad essa
senza l'utilizzo di quasi come molte risorse
come HTTP potrebbe tradizionalmente fare.
E Socket IO è una biblioteca node.js
che lo rende molto più facile effettuare le connessioni socket
o illusioni lì a per vecchi browser
in modo che è possibile implementare questa funzionalità in tempo reale di.
Quindi, ecco un esempio.
Questa roba fino in alto ottiene un po 'più complicato
ma è soprattutto il copia e incolla dalla documentazione socket.io s '.
Ecco ora una più gestore precisa richiesta.
Se l'utente richiesta di un slash, quale file sto andando
di essere apparentemente servire fino a loro?
Index.html.
E c'è qualche nuova roba qui torrente
che vi mostrerò in un attimo.
Ma questo è solo un altro modo
di afferrare un file di un poco più efficiente
che solo facendo fs.readFile.
E 'un po' più intelligente soprattutto per i file di grandi dimensioni.
Quindi, per farla breve, queste righe solo per servire
un file chiamato index.html
che per ora assumere contiene il form HTML con cui Alice
e Bob potrebbero comunicare tra loro.
Infine, io.sockets.on, quindi questo proviene da questa linea qui.
Quindi, sto solo leggendo il documentazione io.socket mi dà
accesso a un cosiddetto WebSocket con un browser,
tra il browser e il server.
Sto ascoltando per la speciale Collegamento evento che mezzi
quando l'utente prima colpisce il server cercando
per aprire questo proposito, sono andando a chiamare questa chiamata indietro.
E ora, sto andando fare quanto segue.
Ogni cinque secondi, che cosa ho intenzione di fare?
Ho intenzione di emettere o diffondere se vi ricordate zero,
il linguaggio grafico sarebbe che un blocchi di trasmissione?
Quindi, si sta andando ad emettere
o attivare un evento chiamato arbitrariamente dal server.
E sta andando a contenere un messaggio Ping
e la data corrente.
Così, questo è un effettivo di chat server che Alice
e Bob può usare, ma è sorta di una chat di server automatizzato
dove i messaggi sono ping appena sorta di sonar.
E 'solo che risalgono a tempi che sono inviati ogni cinque secondi.
Quindi, se ho effettivamente funzionare questo cosa - e questo è tutto.
Per essere chiari qui, avviso questo è solo registrando qui.
Quindi, vorrei passare un occhio a questo.
Lasciatemi fare il nodo di app.js.
Lasciami andare al mio browser.
Ricaricare la home page qui.
[Pausa]
E lasciatemi chiudere l'ispettore.
Ogni cinque secondi, ho un dimostrazione, anche se non
interattivo per il consumo umano
di qualcosa che è accadendo in modo asincrono.
Nel bando del browser, non c'è nessuna icona di filatura.
Si utilizza una funzione amatore di Chrome nei browser moderni
di mantenere una presa connessione sotto la cappa
ed è quello che si chiama generalmente un modello pub / sub,
publish / subscribe modello, dove non abbiamo fatto
che molto esplicitamente qui.
Ma che cosa è bella di questa pub generale / sub paradigma è
che si può avere un solo editore.
In questo caso l' server centrale e tutti
dell'individuo i browser sono client.
Alice e Bob del mondo può iscriversi ad esso,
in modo da poter inoltrare i messaggi tra un qualsiasi numero di utenti.
E anche se ancora siamo non vedendo l'interattività,
abbiamo avuto forse 12 linee di codice solo per fare questo.
E probabilmente non è un salto immaginare come si potrebbe montare
il file index.html che ha un form HTML vero,
po 'di codice jQuery con Ajax che non invia un giorno
ma solo manda a prescindere Alice Tipo di Bob al server
e quindi il server provvede a darne fuori.
E prometto di intravedere in un'ultima cosa giusta
a prendere in giro voi con questo.
Se andiamo nel flusso zero e uno,
vedrai il codice che è solo un po 'diverso qui.
Solo così hai visto, questa è un'alternativa
a quello che ho chiamato il fs.readFile metodo precedente, in base al quale,
si può dire node.js, "Go leggere questo file in memoria.
Ma se è grande solo dare me un pezzo alla volta. "
E si potrebbe sapere da CS165
o 161 i file system avere diverse
proprietà di prestazione.
Si potrebbe desiderare di leggere in blocchi di 512 byte
o 2 kilobyte o qualsiasi altra cosa.
Questo è un modo di ottimizzare di tornare d'atto iterativo
in modo che si può sputare un po 'più rapidamente
al browser oa chiunque sia il cliente finale è.
Così enorme quantità di contenuti oggi e stiamo andando a fare immersioni
più in dettaglio il Mercoledì con Tim [ortografia assunto]
in particolare guardando a come si può tradurre alcune delle idee
dalla prima metà del Naturalmente Laravel e modelli
in una libreria che egli stesso ha scritto chiamato Bookshelf.js
che è diventato sempre popolare nella comunità
perché ti dà la maggior parte di esso,
se non superiore al funzionalità del eloquente
che il richiamo è che intuizione biblioteca di Laravel,
così più su questo e di più come
di sviluppare a pieno titolo applicazioni su Mercoledì.
Ci si vede allora.