>> Wszystko w porządku.
Więc Cliffhanger było, co jest node.js jak wiesz, to dzisiaj?
Cokolwiek? Tak?
>> To było jak Ramy piśmie JavaScript
ogólniej - wnioski
>> OK, to działa.
>> - Wiem, jak typowych zastosowań, takich jak -
czy coś ci może zrobić, to jak -
[Niesłyszalny Uwaga]
>> OK, dobrze.
Tak, więc jest to ramy.
Jest to silnik o którym może wykonywać kod JavaScript
strona serwera.
Może to oznaczać, najprostszych rzeczy
jak pisanie wiersza polecenia Skrypt nie w Pythonie czy Bash
lub Ruby lub PHP, ale tylko w samym JavaScripcie
i wykonanie go w miga wiersz polecenia.
Albo rzeczywiście można uruchomić to w ramach serwera WWW.
I faktycznie w ciągu node.js sama,
ramy jest cała masa biblioteki, wśród których są
serwer HTTP wbudowanym.
Tak, rzeczywiście można napisać Serwer jak zobaczymy
za chwilę, bardzo łatwo po prostu do zrozumienia trochę
HTTP i TCP i portów.
I można ikra słuchania serwer WWW bez Apache,
bez Microsoft IIS.
Bez jakiegokolwiek innego zainstalowane oprogramowanie,
może to po prostu tarło i słuchać większości dowolnego portu
od systemu, który masz prawo do.
Więc sprawa i punkty, pozwól mi iść i otworzyć
do tego np. serwer-0.js.
Więc zauważyć, że szczyt tego pliku, tylko kilka
z nieciekawych komentarzy, i to nie jest para
reprezentatywnych linii kodu że zobaczymy recurringly.
Tak, var HTTP dostaje wymagają "http".
Tak, wbudowany w node.js " Infrastruktura jest cała masa
modułów, które są naprawdę tylko biblioteki i wszystko jest sortowanie
od nazwy miejsca z unikalny identyfikator
jak to jest "HTTP".
Tak, że tak jak w wielu w językach takich jak Java i C + +
i C, tylko wtedy, gdy importowania lub zawierać
lub w węźle mówić wymagają Moduł ma swoje bity.
I cała pamięć wymaga ładowane
do pamięci RAM, a więc stosowany.
Tak, to ten rodzaj obciążenia biblioteki lub moduły na żądanie.
Oznacza to, iść do przodu i wymagają
dla tego programu Biblioteka HTTP,
i odnoszą się do tej biblioteki przez sposób zmiennej o nazwie HTTP.
Ale ten symbol z lewej strony może zostały nazwane coś, bla,
bar, baz, to nie ma znaczenia.
Tak więc w przeciwieństwie do C + + i Java, C, gdzie, kiedy potrzebujesz
lub zaimportować bibliotekę, to po prostu rodzaj
o staje się dostępny na całym świecie,
są moduły node.js mocniej nazw.
Tak, że własne - to funkcjonalność tylko w danym momencie
w drodze tej nazwy zmiennej.
Nie można po prostu zacząć metody typowania, które istnieją
w tym właśnie sposób który jest prawdopodobnie dobry,
bo wtedy obszar nazw nie dostać prawie tak zaśmiecone
jak w wielu językach.
Dobrze, więc teraz jako wspólne sugerują, tworząc serwer HTTP
Jonathan [zakłada pisownia] było możliwe jest dosłownie
tak proste, jak dzwoni stworzyć wewnątrz sposób serwer
modułu HTTP.
Tak więc, ta wraca odniesienia
do jakiegoś serwera.
Doszło do Apache, nie muszą jak waga ciężka.
Ten jest trochę prostsze.
A teraz muszę tylko po prostu zrobić kilka rzeczy.
Więc po pierwsze, pozwól mi przejść do dołu tutaj
i pominąć obsługi Sposób na chwilę.
I zauważyć tego wiersza kodu,
które server.on jest zasadniczo oznacza serwer -
słuchać, jak w kodzie jQuery,
nasłuchiwać zdarzenia zwany wniosek
i tylko zgadywać co mam zrobić
gdy zdarzenie kupna pożary w serwerze.
Tak?
>> Zadzwoń do obsługi funkcji.
Tak, dosłownie wykonać Kod, który jest określany
przez tą zmienną i faktycznie nie zmienna do symbolu tutaj
co to jest symbol na myśli?
Cóż, to nazwa funkcjonować tutaj
i obsługi najwyraźniej przyjmuje dwa argumenty.
Dlaczego dwa? Cóż, jeśli tylko nie dokumentacji przeczytać
dla danego modułu, można będzie mówił, że program obsługi
że zostanie wywołany zostanie przekazywane co najmniej dwa argumenty,
odniesienie do wniosku,
wewnątrz i na życzenie dosłownie oznacza żądanie HTTP.
Tak więc, wszystkie te nagłówki HTTP , które można przywołać
od początku Semestr lub niektóre przed klasą
lub doświadczenie jak uzyskać kreska i hosta
i linii User-Agent, wszystko to jest zamknięty i więcej w środku
tego obiektu żądania.
A odpowiedź jest obiekt sortowanie danych wychodzących.
Tak, masz odniesienie do obiekt, który będzie pozwalają ci
wysłać informacje do przez wywołanie metody przeglądarki
na tym ostatnim argumencie nazywa Res na odpowiedź.
Ale to może być nazywany foo lub bar, to są tylko konwencjami.
Więc teraz, co mam zrobić?
A wydaje się, że w środku z tego bardzo prostego serwera WWW
że jestem wykonawczych, jestem będzie wykonać następujące czynności.
Zamierzam napisać HTTP nagłówek z kodem stanu 200,
200 Znaczenie OK, wszystko jest dobrze.
A potem, będę przejść na pozornie.
Co jest typ danych Drugi argument do prawej głowy?
>> To obiekt?
>> Jest to obiekt z ile klucze i wartości?
Tylko jeden z każdego, w prawo, jeden klucz wartość pary.
Tak, "Typ zawartości".
I tylko dlatego, Cytuję tutaj jest
ponieważ może być myślnik łączyła do znakiem minus
lub coś w tym stylu.
Więc muszę go zacytować tutaj, małpa lub podwójne cudzysłowy.
Ale znowu wspólny paradygmat
w kodzie JavaScript jest często pojedyncze cudzysłowy w tych dniach,
dwukropek, a następnie wartość.
Tak, to jest tylko tzw. typ umysłu.
To jest nagłówek HTTP że dosłownie idzie
zadowolić typu myślnik okrężnicy Tekst ukośnik zwykły że będzie
które mają być wysłane z serwer do przeglądarki
tak, przeglądarka wie czy uruchomić ten tekst jako surowiec
lub HTML lub jako zdjęcie lub film
lub plik flash lub cokolwiek innego.
Teraz, gdy mam naprawdę chcą wysłać w korpusie stronie?
Cóż, po prostu przez czytanie Dokumentacja
do obiektu odpowiedzi Wnętrze tej bibliotece.
Widzę, że jest w porządku metoda i że trwa ciąg,
być może inne rzeczy, ale minimalnie łańcuch.
I to, co jest ciąg wypluwać do przeglądarki.
W tym przypadku jego bardzo proste, jego hello world,
ale może to być opne Uchwyt, html, blisko uchwytów
Uchwyt głowy otwarte, zamknij Uchwyt i tak dalej,
to może być surowe html.
Ale trzymamy przykład proste tylko o plucie
z najprostszych typów umysłu który jest prawdopodobnie text / plain.
A następnie Response.End tylko oznacza zamknięcie połączenia
i wszystko, co mam wysłać rodzaj buforowane wewnątrz
tego obiektu z powrotem przeglądarce.
Skończyłem. Dobrze.
Tak, ostatnią rzeczą, Robię tutaj
i jest nieco arbitralny i ma być cool,
jest Mówię Serwer wreszcie słuchać
w niektórych TCP domyślnie port.
Przypomnijmy, od początku z klasy, że usługi -
lub zazwyczaj wyjątkowo zidentyfikować za pomocą numerów,
AD jest internetowa, 443 jest oparty HTTP strony internetowe, 22 jest SSH, FTP 21 jest
i 1337 jest po prostu arbitralne ale jest wyższy niż 1024
co oznacza, że ​​w większości systemy, można go użyć
bez konieczności Super uprawnienia użytkownika.
Więc jest to po prostu wygodne.
Ale 8080 jest w off - wspólne jeden, 8088, naprawdę nic duża
w tysiącach jak wspólna ale to jest po prostu bardziej elitarna.
W porządku, więc co się dzieje, kiedy faktycznie uruchomić to?
Cóż, nie tylko odwiedzić strona w przeglądarce.
Plik ten nazywa się serwer-0.js.
Bo znowu, Apache teraz z obrazka
w drugiej połowie przedmiotu.
Jeśli chcę internecie serwer, trzeba napisać
a następnie uruchomić ten serwer WWW.
Ale okazuje się, że obsługa JavaScript zarówno po stronie klienta
i jest po stronie serwera interpretowany język.
Tak, wszystko, co potrzebne jest tłumacza.
Więc it's - jeśli nalegać, aby uruchomić węzeł i serwer-0.js,
I może lub nie może zobaczyć niektóre wyjścia w zależności
na jakiej biblioteki podaję, Wydaje się, że nic nie dzieje.
Ale pozwól mi iść do przeglądarka i pozwól mi odejść
do tego samego adresu IP moich klientów CS50.
Ale może to po prostu oraz być moim Mac
czy mój komputer, a następnie naciśnij enter.
Wygląda na to, że rzeczywiście Apache.
To jak w katalogu Lista patrzyliśmy
co w pierwszej połowie.
Więc, co zrobiłem źle?
Tak.
[Niesłyszalny Uwaga]
Dokładnie, prawda?
Tak więc, wciąż słuchając Apache na domyślnym porcie 80.
Chociaż może to zmienić, Mogłem go wyłączyć wszystkie razem
ale nadal działa.
Ale ci faceci mogą oczywiście współistnieć.
Po prostu trzeba umieścić okrężnicy 1337, a następnie być może
a może nie ukośnik w koniec, aby uzyskać dostęp do tego portu
że serwer jest uruchomiony na.
A teraz widzę, że Witaj, świecie powrócił.
I mogę przeładować jak wiele razy, jak chcesz,
to wciąż serwuje się strony.
Rzeczywiście, jeśli otwarcie Chrome Inspektor, przejdź do sieci
a następnie odświeżyć całą stronę,
zauważyć, że w rzeczywistości jest to Wniosek, który został wysłany.
Jeśli patrzę na Raw źródła,
zauważyć, moja przeglądarka wysyła wszystkie z tych rzeczy.
A następnie odpowiedź Kelner był bardzo prosty.
Istnieje 200.
Jeśli to nie jest zbyt niska na ekranie
jest typ zawartości.
A następnie node.js rodzaj automatycznie
dla mnie i dodaje datę wszystkie inne rzeczy
że przeglądarki zwykle spodziewać.
Więc, po prostu zobaczyć trochę sprawdzenie poprawności.
Pozwól mi wrócić do kodu w serwerowni 0.js i niech mnie -
za każdym razem idę do obsługi,
powiem tylko console.log.
("Mieliśmy gościa!").
I nie trzeba przebudować lub coś w tym stylu,
jest to język interpretowany.
Więc teraz, pozwól mi wrócić do Strona, załaduj jeden, dwa,
trzy razy i przejść z powrotem do mojego okna.
I teraz widzę to.
Dobrze, że to dziwne, Widzę sześć linii.
Ciekawe www ciekawostki, dlaczego Mam sześć wniosek nie trzy?
Tak?
[Niesłyszalny Uwaga]
Tak. Tak więc, jak wiadomo trochę głupi ikona w górę
z paska przeglądarki, że wiele
do witryn wykorzystywanych sił być herb Harvard,
może to być logo firmy lub coś w tym stylu.
Tak, rodzaj przeglądarki te dni
z rozmyślnie zrobić dodatkowe żądania HTTP
do prawie każdej stronie internetowej, że odwiedzanych sprawdzenie, czy istnieje
domyślnie pliku nazwie favicon.ico
w tym samym katalogu, co plik, którego szukasz.
A jeśli tak, to stawia Ikona nie.
Więc wszystko widzimy jest dokładnie to.
A w rzeczywistości, zobaczymy, czy mamy Można to zobaczyć, a nie typu
się po prostu: "Mieliśmy gościa".
Pozwólcie mi iść do przodu i wyjście.
A ja tylko wiem to od patrząc na dokumentacji.
Jest własnością wewnątrz Obiekt żądania nazywane URL
co zdarza się ścieżka
że została wezwana w konkretnym URL.
Tak więc, jeśli ponowne uruchomienie serwera po prostu przez ponowne uruchomienie węzła
na i serwera 0.js teraz ma ten jeden, dwa,
trzy i wróć tutaj.
Jest.
Slash jest to, co ja - o ludzkie
w favicon.ico jest co przeglądarka jest
rozmyślnie zainteresowanie.
Ale nie chodzi o to tak wiele rzeczy favicon
ale jak serwer działa.
Tak?
>> Dlaczego to ma być jakiś wniosek?
>> Dlaczego to ma - przez naturę, jak HTTP działa.
Więc, może tylko żądać HTTP jeden plik na raz.
Przeglądarki mogą być inteligentne te dni
i utrzymać TCP Połączenie otwarte.
Jeśli miała CS143 lub ogólnie zaznajomieni z sieci,
dzięki czemu można uzyskać wzrost wydajności
przez utrzymywanie sieci Gniazdo otwarty
w podejmowaniu wielu żądań HTTP wywołań seryjnie nad nim
ale to jeden plik na życzenie.
Tak więc, jeśli na stronie coś takiego -
To znaczy możemy przejść do większość żadnych stron.
Jeśli pójdziesz do - powiedzmy podciągnąć Inspektor tutaj Chrome.
Może to się wypełnić najbardziej strony.
Przejdź do karty sieciowej i przejdź do www.cnn.com.
I podczas wizyty cnn.com, jego strona główna -
Twoja przeglądarka raczej potwornie sprawia, że ​​- nadal liczy.
OK. Co najmniej 289 HTTP wnioski ponownie i ponownie.
I dlatego, kiedy odwiedzasz strony internetowe, szczególnie nadęty
są powolne, aby załadować ponieważ wszystkim
aktywów oni ładowania.
Tak, wygląda na to, 298.
Nie mogą być pewne Ajax dzieje w tym momencie lub niektóre
aktywów są po prostu niskie.
Tak więc, każda z nich jest indywidualny wniosek wraca
iz powrotem, tam iz powrotem.
I dlatego wcześniej, nawet choć jakby mówił
o tym nieco fantazyjnie gdzie można umieścić znacznik skryptu,
absolutnie sprawia różnica kiedy masz -
zacząć się dużo ruchu i wiele
z plików, których dotyczy żądanie.
A to oznacza każdy Prawdopodobnie obraz, plik multimedialny,
plik JavaScript, Plik CSS lub podobne.
Tak, jesteśmy już do tylko około 4 megabajty
przyjrzeć się dzisiejszej wiadomości.
Dobre pytanie.
Dobrze.
Więc, jakie są niektóre choć upsides?
Dobra, wiemy, jak zrobić strony internetowe już z PHP.
I wielu z was przyszedł do Klasa wiedząc Django
Szyny i Python czy Ruby.
Więc, po co nam kolejny język i infrastruktury?
Co to jest node.js szczególnie dobry, jeśli wiesz?
[Pauza]
Niektóre rzeczy?
Nie? Tak?
>> Przekazywanie wiadomości.
>> Tak, przekazywanie wiadomości.
Tak to prawda i że to prawda z tego powodu bardziej technicznym
i że node.js i naprawdę JavaScript jest szczególnie
Dobrze nadają się do asynchronicznego Kod,
jeśli przy czym utworzyć iluzja
robić wielokrotność rzeczy na raz.
Tak więc, nawet jeśli są one naprawdę dzieje się seryjnie,
faktycznie w większości przypadków Zarówno po stronie klienta JavaScript
i jest po stronie serwera jednowątkowej.
Które, jeśli bierzesz 161 lub nawet 61 oznacza -
tego programu wiedzą,
tłumacz może dosłownie zrobić tylko jedną rzecz na raz.
Ale to nie jest dobre dla coś jak serwer WWW
gdzie można mieć dziesiątki lub setki a może nawet tysiące
użytkowników wszystkich próbujących aby uzyskać dostęp do strony internetowej
w tym samym czasie.
I jeszcze, że sugerują, że im obsługi jednego
Po drugiej po zwłaszcza jeśli niektóre inne
z tych kryteriów, jak widzieliśmy CNN może wymagać obsługujących
się przed wami do 300 plików nawet dostać się do następnego użytkownika
kto chce zobaczyć mówi wiadomości.
Node.js lepiej nadaje w środowiskach, takich jak to.
Bo to, co się dzieje, każdy proces powolny bieg
jak odczyt z dysku lub pliku zapytania do bazy danych lub rozmowy
do innego serwera sieciowego
, które ma tendencję do opóźnienie, prawda?
Jeśli trzeba było 61 lub 161 przede wszystkim z tego rodzaju
usług peryferyjnych wydają się być znacznie mniejsza
niż cokolwiek wewnątrz sama pamięć RAM i sam procesor
że mówią w tym przypadku Serwer jest uruchomiony.
Ale to, co jest ładne o node.js jest to, że można -
ogólnie i JavaScript jest to, że można zrobić coś
a potem powiedzieć: "Hmm, to się dzieje
podjąć mi kilka milisekund lub nawet kilka sekund.
Pozwól, że coś w rodzaju talerza off " ale to nie jest prawda, proces.
A kiedy to się robi robi , że powolny proces docierania
jak pobieranie wierszy z bazy danych lub odczytu pliku. html
z dysku, to będzie wróć do mnie, a
niż ja konieczności oczekiwania na nią.
Tak, aby to bardziej jasne.
To jest moje środki czyniąc to bardziej zaznajomieni.
Wszystko w porządku, więc jest Shake Shack na placu.
To jest coś w rodzaju wspólny paradygmat
dla wyjaśnienia asynchroniczność.
To jest rzeczywiście dobry Przykładem bo Shake Shack
i są wyjątkowo smaczne Burger zwolnić za to, co robią.
Ale chodzi o to, że są naprawdę dobry w realizacji zamówień
i biorąc pieniądze po które można czekać na jedzenie.
Tak więc, jest to w rzeczywistości lepiej projekt niż alternatywa.
Bo przypuszczam, idziesz do sklep tak i masz
do przodu i linii złożeniu zamówienia i chcesz
do hamburgera, najlepiej jak potrafię powiedzieć, trwa co najmniej pięć
lub więcej minut do rzeczywiście dostać hamburgera.
Tak, to będzie rodzaj złego modelu biznesowego
jeśli podczas oczekiwania na przybycie burger, Alice [zakłada pisownia]
i Bob [przyjęto pisownię] i Charlie [przyjęto pisownię]
i wszyscy inni w kolejce za tobą
i są dosłownie blokuje Linia czekając na jedzenie.
Tak oczywiście, w Shake Shack
i innych fast food miejsca, nie rób tego,
robią coś takiego.
Dają ci brzęczyk.
I rodzaj wysłać Ci na drodze.
I nazywają cię przez co to małe coś wibrowało
lub lampy błyskowej, aby zwrócić uwagę.
Tak, to jest dosłownie to, co?
Coś jak node.js robi.
Jeśli node.js lub JavaScript ogólnie jest stosowany
i programista jest na tyle sprytny,
uświadomić sobie: "Wiesz co?
Cokolwiek, co należy zrobić w prawo tutaj może trochę numer
milisekund lub sekund.
Wiesz co?
Pozwólcie mi iść do przodu i nie Nazywamy to synchronicznie -
"Facet, który jest blokowanie wszyscy w kolejce "-
pozwól mi iść do przodu i rodzaj bok
i po prostu nazywają się z powrotem
kiedy tak długo pracuje operacja jest zakończona ".
I oczywiście oddzwonienie jest w tym przypadku nawiązujące
do funkcji wywołania zwrotnego, Odniesienie do uchwytu o kodzie
który zostanie wykonany gdy burger jest gotowy,
podobnie jak to coś ma pewne rodzaj funkcji wbudowanych
że zaczyna wibracyjny lub brzęczenie, kiedy jest czas dla Ciebie
zostać wezwany do przed linią.
Więc, co to myśli realnie?
Cóż, musimy wypracować sobie drogę w górę.
Więc pozwól mi iść do przodu i to zrobić najpierw.
Z serwera 1.js, pozwól mi najpierw uprościć kod
więc możemy podjąć kroki dziecka w kierunku bardziej przekonujące problem.
Jest to dokładnie taka sama program, który napisałem wcześniej.
Ale to, co zostało zmienione?
Jest jakby lekkie Różnica składniowym
między tą Wersja 0 chwilą.
Co wyskakuje na Ci, jeśli pamiętacie?
Tak Cynthia [przyjęto pisownię]?
[Niesłyszalny Uwaga]
Tak. Więc teraz, że mamy linię z funkcją podjęcia w.
Musimy pozbyć w tym rodzaju
z bezużytecznie nazwie Funkcja obsługi.
Bezużyteczne tylko tym, że przed nawet nazywając je w jednym miejscu,
I naprawdę nie trzeba tracić czasu dając mu nazwę
i utrudniając odczytać kodu z góry do dołu.
Więc, po prostu zadeklarować inline jest anonimowa funkcja.
I robię dwie inne rzeczy.
Robię lepiej Zastosowanie notacji dot.
Tak jak w jQuery, wiele węzła metody można ze sobą powiązać.
Tak, że po zakończeniu wywoływania coś, nie musisz
czekać do nowej linii i wywołać inną metodę,
można po prostu łańcuch je razem.
I tak w ten sposób możemy naprawdę dokręcić to.
Tak, to jest dosłownie serwer www w pięciu liniach
z całości kodu w przeciwieństwie -
W odróżnieniu od was mogą normalnie zrobić, aby ustawić coś.
Jeśli pójdę do serwera 2 teraz, zróbmy to.
Serwer 2 - faktycznie niech wrócić do tego serwera. 2.
Niech teraz otworzyć asynchronicznej-0.js i rozwiązać ten problem pod ręką.
Więc po pierwsze, chodźmy do przodu i otwarte
się asynchronicznych-0.js w przeglądarce.
Więc asynchroniczny-0, pozwól mi odejść z powrotem do przeglądarki.
Przeładować.
I teraz, to jest rodzaj komunikatu o błędzie.
Rzeczywiście widzę 500 w Inspektorze Chrome.
Ale pozwól mi dokładniej zażądać hello.txt.
OK. Tak, to wydaje się działać.
Więc asynchroniczny-0.js nie wydaje się służyć do czegoś dla kreską.
To nie ma żadnego wsparcia domyślnie plik.
Ale jeśli wyraźnie zażądać hello.txt,
który wydaje się być wsparcie.
Dlaczego tak jest?
No, co ja już tutaj
i zrobione jest realizowany super prosty serwer WWW
który pokazuje, gdzie asynchroniczność mogą być użyteczne.
I że jest realizowany w następujący sposób.
Po pierwsze, używam Moduł HTTP ponownie,
ale także FS, które prawdopodobnie oznacza?
W ogóle w CS, system plików.
OK, system plików.
Stąd dalej FS, system plików.
Dobra, więc co Czy jest to dla mnie?
Funkcje związane z plików, takich jak przekazywane coraz
otwierania plików, pisanie katalogi katalogi, czytanie
i wszystkie tego rodzaju rzeczy.
Więc teraz zauważyć, ten kod są takie same jak poprzednio,
stworzyć serwer, przechodząc w anonimowej funkcji.
Jest to rodzaj arbitralne.
Nie jest to bardzo bezpieczny serwer WWW.
W rzeczywistości, można uzyskać dostęp do najbardziej dowolny plik na dysku twardym
lub na serwerze jest trudne jazdy, wykonując ten kod
bo jestem ślepo przy założeniu, że będę
, którzy bez względu na użytkownika Zwrócono w adresie URL.
I mam zamiar poprzedzić je kropką
tak, że jestem nieznacznie jest bezpieczny
mówiąc, że mogą cokolwiek plik Wniosek musi przynajmniej początek
w bieżącym katalogu.
Oczywiście istnieje zagrożenie tutaj.
Bo jeśli zamiast obejmują co?
Na ich drodze, mogą one rodzaj z obejścia, że ​​zbyt.
Kropka, kropka, prawda?
Tak więc, jeśli użytkownik po prostu umieścić kropkę, kropka w adresie URL, w teorii,
mogliby zacząć My - i powiedzieć pliku haseł.
Tak więc, nie należy rozumieć być zabezpieczone
to ma być proste.
Więc, mam zmienną, jest połączeniem kropką
który jest obecny katalog i żądanie URL
które widzieliśmy wcześniej, jest jak slash lub / hello.txt.
Więc teraz, robi trochę bardziej interesująca.
Po pierwsze, zauważyć dno.
Słucham na samego portu, jak wcześniej.
Tak naprawdę interesująca praca wewnątrz tutaj.
Za każdym razem wniosek przychodzi z natury
tego kodu, co ja tu robię?
Dzwonię plik Sposób odczytu systemu plików,
przechodzącej w torze które chcę przeczytać.
I teraz, to jest co ciekawe tutaj,
to jest poprzez realizację W sposobie asynchronicznego.
Nie można uzyskać zwrot wartość z pliku odczytu.
W rzeczywistości uprzedzenia, jest Wyrażenie po lewej stronie nie ma
z lewej odczytu pliku.
Nie zwraca wartości.
Przeciwnie, wymaga wywołania zwrotnego działa, gdy jest gotowy
dać z powrotem odpowiedź.
Więc znowu się jasne, podczas gdy w przeszłości,
w wielu programowania Języki, gdybyś
czytać przypadek plik w pkt PHP,
Plik podkreślenia dostać podkreślenia treści,
masz lewe wyrażenie we wszystkich wartości po -
przed znakiem równości, to oznacza, że ​​przypisujemy
do tej zmiennej powrót Wartość tej funkcji.
Możesz to zrobić w node.js, ale zazwyczaj
zadzwonić wyraźnie synchroniczne wersje funkcji jak,
Myślę, że to czytać sync Synchronizacja plików lub odczytać pliku.
Zapomniałem, jak nazwali go.
I że da Państwo zwraca wartości.
Ale czy ten plik jest na niektóre zdalny system plików
lub dysk jest po prostu naturalnie wolno, może to potrwać 10 milisekund
lub 2 sekundy dla tego pliku faktycznie wrócić.
W tym samym czasie, nie ma innych internetowej Goście są obsługiwane
przez Websit.
Blokujesz.
To jest to, co się nazywa blokowanie IO, wejścia / wyjścia.
Więc, to jest o wiele mądrzejszy.
Bo to, co się dzieje node.js
zrobić na interpretacji jest następujący,
to będzie zadzwonić Metoda plik odczytu,
spróbować jednego do pliku, który ma Ścieżka określona przez wartość P.
, A następnie, czy i kiedy będzie gotowa dać z powrotem zawartość
akt P, to zadzwoń Funkcja, której podpis jest
umownie następujące.
Dwa argumenty, pierwszy co jest być może obiekt Błąd,
Kapitał E, to obiekt zwany błąd lub Null
jeśli nie ma takich błędów.
I drugi argument - podjąć Domyślam - będzie co?
Nazywa się oczywiście, ale dane to, co jest dane bardziej konkretnie?
>> Spis treści?
>> Zawartość hello.txt na przykład Wyciągnąłem
w mojej przeglądarce chwilą.
Więc innymi słowy, aby przeczytać plik funkcje i wiele node.js
jak na nie zwracać wartości.
Nazywają zwrotnych i przekazać
do tych wywołań zwrotnych, co byłoby były tradycyjnie
wartość powrócić.
Zaletą tego podejścia jest to,
które można nazwać czytaj plikowi T0.
Funkcja zwrotna potęga nie można nazwać jeden tick później
że tak powiem w T, to można nazwać T1000,
tysiąc kleszczy później.
Ale chodzi o to, że Reszta kodu w tym pliku,
jeśli natychmiast być wykonane podczas node.js
i podczas gdy system plików domyśla się, jak czytać
że plik i uzyskać go z powrotem do Ciebie.
Więc stworzyć to -
tak skutecznie iluzja
równoległości, pozwalając wolniejsze procesy jazdy nie jest
blokować ważne rzeczy, część, która obsługi użytkowników.
Tak więc, w jaki sposób sobie z tym poradzić?
Jest to bardzo często node.js paradygmat.
I nie sposób tak, aby uprościć to zobaczymy przed sobą.
Ja najpierw sprawdzić, czy Błąd nie jest null.
Tak więc, jeśli to nie jest fałszywe to nie był błąd.
Nie wiem co to jest, może plik nie istnieje.
Nie masz uprawnień.
Ścieżka jest źle.
Dowolna ilość rzeczy może się nie udać.
Na razie mam zamiar arbitralnie powrócić 500
który jest wewnętrzny błąd serwera.
Coś poszło nie tak.
I naprawdę nie obchodzi aby go zdiagnozować.
Więc, po prostu powiedzieć Użytkownik jest uszkodzony.
A potem, będę zrobić res.end,
i to jest zapis uproszczony.
Przypomnijmy, że w zeszłym czas zrobiłem res.write
a następnie zrobiłem res.end.
Jeśli chcesz tylko do wysłać jedną linię produkcji,
można po prostu zrobić to wszystko na raz z res.end z argumentem,
oraz że zamierza wysłać co jest komunikat o błędzie
wewnątrz tego obiektu przeglądarce.
To było dość iskrzenie Przypomnijmy chwilą.
Nie mam pojęcia, co to przeznaczona na pierwszy rzut oka.
Ale kiedy poprosiłem Plik, który nie istnieje -
Niestety, musimy uruchomić serwer ponownie.
Kiedy poprosiłem o pliku , że nie istnieje, EISDIR,
więc coś o to jest katalog,
jeśli robię jakiś przypadkowy ciąg tam,
podobno to oznacza Plik nie istnieje.
A to dlatego, że mój kod jest po prostu, aby pisać
na co Raw Komunikat o błędzie,
Nie bardzo przyjazny dla użytkownika, tak ale przynajmniej mam posługiwaniu się nim.
Innego, gdyby to nie było błędu co ja robię?
Samo, co przed mierzei się o 200 OK, zwykły -
text / plain i umysł typu następnie wypluć dane.
I dlatego jestem coraz Zawartość hello.txt które tylko
w celu potwierdzenia, czy Spojrzałem w hello.txt,
to dosłownie Witaj, świecie.
A gdybym zmienił tę Witaj, świecie, zapisz plik,
ponownie uruchomić serwer, przeładowanie strony.
Teraz mam tę wersję.
Więc, tak naprawdę mam przepisany serwera WWW
jak jest od wielu lat, ale przy użyciu node.js.
Ale możemy to zrobić jeszcze bardziej czysto.
Pozwól mi otworzyć asynchronicznej-1.js.
Teraz zauważył Dodaję kolejny moduł ten czas
najwyraźniej moduł ścieżki.
Teraz, to jest dobry okazja do spojrzenia
na to, co dokumentacja wygląda.
Node.js jest dokumentacja.
Myślę, że jak jest PHP rzeczywiście bardzo dobry
i prosto do przodu.
Jeśli pójdę do node.js i Google i sprawdzić node.js ścieżki,
co zobaczysz zwykle jest bezpośredni link do adresu URL
że kładę się tu przed chwilą.
Tak / api jest oficjalnym miejscem , aby przejść do dokumentacji.
I co można zobaczyć na szczycie
z oficjalnej dokumentacji węzła to wszystkie sposoby i
lub właściwości wewnątrz ten konkretny moduł,
jedna z nich nazywa się przyłączyć.
I dołącz pomocnik jest funkcja że zamierza pozwolić mi
nie przejmuj się wszystkie plusy.
I to dodaje Bonus jak zobaczysz
z doków jest również normalizuje wynikającej ścieżkę.
Tak więc, jeśli użytkownik lub masz kropki lub kropek punktowe lub kombinacja
z tych rodzajów stosunku ścieżki, wśród upsides
sprzężonych sposobu jest to, że to będzie wszystko, co się oczyścić
i daje kanonicznej droga bez żadnych
z tych punktów lub kropka.
Tak, to jest dobra rzecz w ogólnego bezpieczeństwa co najmniej
jeśli sprawdzanie wartość zwrotu, które nie jestem
w tym szczególnym przypadku prostej.
Ale ja nie chcę z niego korzystać.
Więc teraz utworzyć ścieżkę trochę bardziej programowo
z path.join zamiast Raw konkatenacji.
Tak, to jest trochę czystsze niż wcześniej.
A teraz zauważyć czym jestem raczej trochę bardziej inteligentny
niż ślepo próbować odczytać plik,
Idę do rzeczywistości zadzwoń fs.stat.
Tak więc, jeśli jesteś zaznajomiony
z niskiego poziomu C Funkcje i C, nawet w PHP.
Wiele bibliotek posiada Funkcja ta zwraca stat
zasadniczo statystyki na pliku, rozmiar pliku,
uprawnienia, nazwę i takie rzeczy,
, a także w sposób dorozumiany, jeżeli plik istnieje, czy nie,
i jeśli jest to plik lub katalog
lub link symboliczny lub coś innego.
Teraz zauważył, że jestem dzwoniąc fs.stat.
A potem najwyraźniej według z dokumentacją,
Muszę wracać Błąd w obiekcie
lub Null, a następnie przez obiekt statystyki.
Ale niech to sprawdzić, node.js.fs.
Tutaj jest plik Dokumentacja systemu.
Pozwól mi spojrzeć na statystyki.
Jest dużo więcej funkcji tutaj.
Ups, że synchronizacja stat, fs.stat.
Więc, to jest asynchroniczny statystyki (2).
To znaczy, jeśli pamiętam z głównych stron,
Rozdział 2 strony głównej,
Oznacza to, że jest dosłownie tylko realizacja węzła
o niskim poziomie Funkcja System stat.
Tak, dostaje dwa oddzwaniania argumenty, błąd i stat
gdzie stat jest fs.stats obiekt.
Zobaczmy więc, co ten obiekt ma wyglądać.
Załóżmy, kliknij hiperłącze i widzę, że.
Obiekt statystyki zawiera Najwyraźniej niektóre metody pomocnika,
jest plik jest katalogiem, jest kilka innych rzeczy.
To "jest" plik, który mnie obchodzi o w tym konkretnym przypadku.
Więc jestem tutaj.
Jeżeli istnieje błąd, to daj mi tylko ratować ten czas
i zakładać.
Jeśli jest błąd, to był Prawdopodobnie nie znaleziono pliku 404.
To może być coś innego
ale ja jestem za mało leniwy, po prostu skupić się tutaj
na bardziej interesujących szczegółów.
Ale dla użytkownika celów, plik nie został znaleziony,
gdyby nie było żadnego błędu wskazując plik.
W przeciwnym razie, chciałbym sprawdzić, czy plik jest rzeczywiście rzeczywiste plik.
Więc jeśli to nie jest Plik, że istnieje.
Coś tam jest, ale to pewnie katalog
a może link symboliczny
lub coś innego, co jest Funky w systemie plików.
Tak czy inaczej, użytkownik nie powinien go zobaczyć.
Więc teraz, jestem po prostu będzie pluć
konwencjonalnie nieautoryzowane 403.
Ale znowu tylko konwencja,
Mogłem użyć coś innego w teorii.
I wtedy wreszcie, niech mi spróbuj odczytać pliku.
Więc pozwól mi przewinąć w dół.
A teraz, gdzie jest to zauważyć Kod może trochę brudny,
zauważyć, że dzwonię fs.readFile mijania
w tej samej ścieżce same callback, jak ostatnim razem,
więc poprzednia wersja.
A potem, jeśli znajdę -
jeśli nie znajdziesz, Pluję z 500.
A jeśli mam go znaleźć, co linia jedziemy zobaczyć tutaj?
Jedziemy zobaczyć fs napisać nagłówek 200 prawdopodobnie
wysyłanie i res.end rzeczywiste dane.
Ale to zauważyć.
I to nie jest poglądowe w najgorszym przypadku.
Ale mam ten telefon stat tutaj nie mam jakiś materiał.
Wtedy, mam inny asynchroniczne wywołanie tutaj,
więc więcej wcięcia.
Tak, tylko rodzaj ekstrapolacji jeśli można tutaj.
Jaki problem ma tendencję do zaistnienia w język jak JavaScript
w tym środowisku, w którym nie ma wartości zwracanych
ale masz te wywołania zwrotne.
I oczywiście, to tylko Fakt stylistycznych rzecz
że trzymam wcięć.
Ale weź to do logicznym krokiem.
Załóżmy, że nie było jednego lub dwa lub trzy inne funkcje
że muszę wykonać, że były przez charakter asynchroniczny,
a zatem po prostu rodzaj zachować wcięcia ich obsłużyć,
sobie z nimi radzić, aby je obsłużyć.
Masz rodzaj zwrotnego cholery, jak nazywają go
gdzie zaczyna się kod uzyskać bardzo szeroki
i szczerze mówiąc bardzo trudne do odczytania.
Jak to jest, że z trudem można sortować powiedzieć, że jest to rodzaj przepływu
że ma tego rodzaju
z stylistycznie kątowe co się tutaj dzieje.
Tak więc, nie jest idealne, ponieważ to może bardzo szybko stać się
nieporęczny, choć dwa asynchroniczny, nie wymaga
taka wielka sprawa.
Tak więc, możemy tego uniknąć, prawda?
Można było dostrzec, że I misclicked chwilą.
W dokumentacji, wiesz, wygląda na to, że jest statSync.
I statSync nie bierze zwrotna jako argument.
To trwa tylko ścieżkę, ponieważ to widocznie co robi?
Zwraca instancję z fs.stats.
Więc może to być Twój W pierwszym odruchu, prawda?
Zwłaszcza, jeśli funkcje zwrotne
i asynchroniczność jest trochę dla ciebie nowa, szczerze mówiąc,
Najprostszym rozwiązaniem jest chyba po prostu uniknąć problemu wszystko
razem wrócić do sortowania programowania stylu CS101
gdzie można zadzwonić lub funkcji Sposób powraca do wartości
wywołania funkcji, powraca wartość,
Funkcja zwraca wartość.
I w związku z tym można używać fs.statSync
która jest dosłownie to samo ale to jest wersja zsynchronizowana
co oznacza, że ​​wraca wartość.
To nie przejdzie wartości do wywołania zwrotnego.
Ale dlaczego, że prawdopodobnie optymalna obejście uciekać
do funkcji synchronicznych?
Tak?
[Niesłyszalny Uwaga]
Dokładnie, to zajmuje dużo czasu.
Jesteś po prostu spowolnienie wszystko w dół.
Ponieważ podobnie jak Shake Shack lub Tasty Burger, gdyby pozbyli
tych brzęczyki i sprawia, że, Klient stanąć z przodu
linii, aż jedzenie jest gotowy jeszcze przed podjęciem zlecenia
osoby za to oczywiście
przez put spowalnia.
Ludzie zaczynają odchodzić Ci rodzaj rysować pakiety.
Można dokonać dowolnej liczby analogii tutaj.
Ale w skrócie, jest to Prawdopodobnie nie jest dobrą rzeczą
dla biznesu lub dla serwera.
Kod jest tak asynchroniczny zazwyczaj co najmniej dobry
w tym przypadku, ale na pewno zacznie powodować niepokój.
I rzeczywiście, kiedy śmiem twierdzić najpierw pisząc ten,
zajmie to trochę trochę przyzwyczaić.
Więc zacznijmy wyposażyć Ci z niektórych bibliotek
i techniki, aby to trochę łatwiej.
Tak więc, jeden z najczęściej biblioteki są popularne biblioteki
te dni, to jeden nazywa async.js.
I jak wiele node.js biblioteki lub moduły,
to wszystko open source.
Prawie wszyscy żyją i uzyskać repozytoriów, która jest rodzaj piasty
z de facto stają się miejsce do przechowywania tych rzeczy.
A wtedy nie Cała infrastruktura
instalowania tych rzeczy nazywa NPM, Węzeł Package Manager
które jeśli znasz z EvanTube jest rodzaj
podobnego aplikacji lub aplikacji dostać.
Jeśli znasz z Red Hata i Fedory
jak w urządzeniu, to jak mniam.
Ale to jest węzeł - to Menedżer pakietów tylko
w tym szczególnym środowisku.
Tak więc, możemy pobrać i zainstalować rzeczy takie jak biblioteki asynchronicznej
a także jeszcze jeden o nazwie podkreślenia biblioteki lub modułu.
Ale te jak na razie fs, HTTP, ścieżka,
są to wszystko się wbudowane w węzeł.
Więc jeśli idziemy do API docs, będziesz faktycznie zobaczyć, że zbudowany
do węzła można uzyskać za darmo cała masa modułów.
Ale mnóstwo miłych ludzi na Internet dokonały dziesiątki
jeśli nie setki innych bibliotek
robić rzeczy lepiej lub w inny sposób.
Tak, rzućmy okiem na jak działa ta biblioteka.
Tak więc, większość tego kodu jest identyczne w tej chwili.
Mam ścieżki, stworzony do góry.
A teraz dzwonię async.series.
Więc biblioteka asynchroniczny, to tylko biblioteka, która pozwala
przenieść lub podnieść zazwyczaj funkcje, aby wezwali jeden
Po drugiej tylko rodzaj uniknąć tego problemu wcięcia,
i tak naprawdę psychiczne niepokój, że będzie niezmiennie powstają
przynajmniej przy pierwszym nurkować w to na własną rękę
z programowaniem asynchronicznie.
Jak w bok, jeśli wziąć 161 i masz do czynienia z zamkami
i podniesienie warunków i wszystkich tego, asynchronicznego kodu
jak i środowiska node.js jest rzeczywiście dużo,
znacznie prostsze zapewne
niż faktycznie piśmie Kod wielowątkowy.
W każdej chwili masz Kod wielowątkowy,
masz warunki podwyżkę.
Nie musisz się martwić o dwa wątki zawierające
dla tych samych zasobów dysku lub pamięci.
Piękno JavaScript
w node.js jest tam dosłownie tylko jeden wątek,
co oznacza przeglądarkę
lub serwer może tylko zrobić jedną rzecz na raz.
To tylko zależy od Ciebie, programista
zachować psychicznego dla modelu jak rodzaj kolejki rzeczy
i dowiedzieć się, jak zamówić kod.
Ale nie musisz się martwić o podniesienie warunków
w dość podobny sposób na najmniej z surowego kodu jak ten.
Tak, jest to trochę trudno grack tutaj.
Ale - Więc pozwól mi otworzyć docs na chwilę.
Async.js biblioteka, która Podobnie jest bardzo googleable,
żyje w GitHub przesadzać, jak wielu z nich.
Nie myśl, że jest to szkicowy, to nie jest.
Pozwól mi przewijać do Przeczytaj mnie tutaj.
Tak, biblioteka asynchroniczny zapewnia całą masę
metod jej wnętrzu.
Na przykład, nie ma Metoda nazywa się każdego,
które, jeśli to tylko klikam zobaczyć swoje dokumenty na chwilę,
jest to funkcja, metodę , który pozwala zrobić coś
jak czterech każdego ale równolegle.
Oni wszyscy się wydarzy potencjalnie równolegle.
I każdy z nich jest metoda tylko zamiar wrócić do Ciebie, gdy wszystkie
z iteracje są kompletne.
Więc może się zdarzyć jedna po drugiej.
Idealnie, zdarzają się zasadniczo równolegle.
Jednakże sposób ten nie ma oddzwonimy.
Nie Buzz Twoje buzzer, aż wszystkie
elementów trzeba potwierdzili na ukończeniu.
Tak, to jest po prostu dobry sposób
unikanie korzystania proste cztery pętli
ale rzeczywiście robi coś asynchronicznie.
Ale teraz bardziej bezpośrednio związane z tym przykładem
zauważyć, że to jest Metoda serii.
I niech mi tylko podciągnąć proste kanoniczny przykład.
Więc biblioteki Async, seria Metoda przyjmuje się jako dorozumiane
przez nawiasach kwadratowych w tablicy.
Co to są dane rodzaje elementów
w tej tablicy w oparciu na prosty przykład?
To jest tablica funkcji.
Tak w C, możesz zadzwonić im funkcjonować wskaźniki.
W JavaScript, są bardziej prawidłowo odwołuje się do funkcji
lub funkcji anonimowych.
A to po prostu oznacza, tablice
Oczywiście są sortowane od zera wzwyż.
Tak więc, że utrzymują porządek, który jest dobry
dla serii, "seria przyczyną oczywiście oznacza coś zrobić
aby nie równolegle.
Tak więc, tylko oznacza to, że funkcja zostanie wykonany,
Następnie ten, to Jeden, jeden, to ten,
jednak wielu nie ma
aż wreszcie opcja zwrotna jest wywoływana.
Tak, zauważyć tu paradygmat.
I mimo, że ta Biblioteka jest jeden facet,
to przedstawiciel bardzo często paradygmat JavaScript
z ponownym użyciem wywołań zwrotnych.
Tak, zauważy, co robisz tutaj.
W pierwszej funkcji będącego przekazywane w za pośrednictwem tej tablicy
definiowania anonimowy Funkcja tylko z funkcji.
Ogłoszenie ale widocznie zgodnie z tą dokumentacją,
że funkcja powinna anonimowy brać zwrotnego argumentów.
Że będzie wskaźnik lub odniesienie do funkcji
który należy zadzwonić, gdy twój kod jest gotowy do powrotu wartości.
Więc jeszcze raz, tylko w przeciwieństwie do programowania zazwyczaj proceduralne
gdzie jesteś przyzwyczajony do natychmiastowego zwrotu wartości
że jedna różnica z przy użyciu biblioteki tak
w programowaniu asynchronicznym więcej ogólnie, to kiedy jesteś gotowy
aby zwrócić wartość z baza danych, z pliku,
z arytmetyki wyrażenie, to do Ciebie
wywołać funkcję oddzwonienia.
I miła rzecz o bibliotece
jeśli czytamy w dokumentacji dokładniej jest to, że
wtedy i tylko wtedy, gdy wszystkie Powierzchnia callbacki nazwie
bez obiektu Error, Całość będzie sukces?
Tak więc, innymi słowy, jeżeli istnieją 2
jeżeli istnieją 10 anonimowo Funkcje
Dlatego w tej tablicy W tej serii
tylko wtedy, gdy wszystkie z nich uda,
będzie ostateczna opcja oddzwaniania uznać za sukces?
Jeśli ktoś z nich nie, każda funkcja
po tym nie będzie nawet być wykonane.
Tak, to dobry sposób sortowania posiadania łańcuchowego
że przerywa się przedwcześnie jeśli coś pójdzie nie tak.
Tak więc, aby zobaczyć to w kontekście tego to, w jaki sposób mogą ponownie wdrożyć
że poprzedni programu.
Mam ścieżkę jak poprzednio, tak to jest łatwe.
Skopiować wklej ten kod szkielet
Stamtąd dokumentacji async.series otwarty nawias,
otworzyć nawias kwadratowy.
I teraz mam jeden zauważy Funkcja tej początku
sekundy, zobaczymy gdzie iść z tym.
A teraz zauważyć, że jest to Na początku trochę skomplikowane
ale skupić się tylko na to linia po linii.
Fs.stat oznacza uzyskać statystyki lub, co nie z tej ścieżki.
Nazywamy to oddzwanianie, gdy gotowe.
Kod ten jest taki sam, jak poprzednio.
Jeśli jest błąd, jest jedna różnica teraz.
Ponownie, bardzo często paradygmat w programowaniu node.js jest
jeśli coś pójdzie nie tak i zwrotna musi wiedzieć
, że zgodnie z konwencją, najpierw argument wywołania zwrotnego będzie
jest nie, jeżeli wszystko jest dobrze lub Odwołanie do obiektu Error,
Kapitał E. To jak błąd Klasa, która istnieje na całym świecie
ale o tym innym razem.
Więc robiąc to, czy jest błąd, co jest implikacja?
Oraz w oparciu o to, co ja powiedział seria robi,
jest, jeśli coś pójdzie nie tak, po prostu rodzaj chcą
aby przerwać całą serię Funkcja anonimowa zwraca.
Tak, to dla mnie wystarczy po prostu wrócić oddzwonienia mijania
z obiektem Error.
Bo jeśli stat dał mnie błąd,
Może utworzyć nowy Obiekt błędu własne,
ale tak naprawdę nie obchodzi,
Chcę tylko przekazać, co błędu jest to, że rzeczywiście się stało
więc można go przekazać do tej funkcji zwrotnej.
I żeby była jasność, powrót nie jest to bezwzględnie konieczne.
I w zasadzie chcesz to zrobić ale chciałem teraz ma "wrócić;
/ /, Tak, że nie więcej kod tutaj wykonuje ".
Więc znowu inny wspólny Konwencja w JavaScript,
nawet jeśli nie jesteś zwrotu wartości per se,
chcesz przekazać wartość do funkcji zwrotnej
ale chcesz aby zatrzymać wykonywanie
funkcji jesteś w, w trywialny sposób
Aby to zrobić, to po prostu zadzwonić tu wrócić.
Ale nie ma nic złego,
jesteśmy po prostu robi powrotnej oddzwonienia błędu, mimo to będzie
powrót wartości nieokreślonej.
W porządku, to nie ma zwrócić wartość najbardziej prawdopodobna.
Obchodzi mnie to pokład dalsze wykonywanie.
Tak, mój conflation z nich dwie linie to tylko stylistka
do konwencji tylko do mają liczbę linii
kodu po prostu napisał od 2 do 1.
Co jeszcze?
Jeśli nie jest błąd -
faktycznie być jasne Mógłbym też uniknąć
że w ten czy inny.
Ale znowu, inny wspólny paradygmat jest kontrola
dla swoich błędów, a następnie do góry po prostu wrócić, a nie kontynuować
wcięcia kodu z elses i elses i elses.
Więc jeśli to nie jest plik, teraz wiesz,
Chcę się tym zająć trochę specjalnie.
Tak tu jak w Java lub C + + lub kilka innych języków,
Oto jak można utworzyć wystąpienia obiekt wpisać odejście błędzie
w domyślnej wiadomości Plik nie z
i to właśnie nieco arbitralny.
Ale ja sygnalizacji błąd w moim własnym.
A co robi ten ostatni linia prawdopodobnie oznacza?
Wszystko jest dobrze.
Jeśli zdasz null dla Parametr error, że tak myśli
umownie wszystko jest dobrze.
Tak więc, co oznacza, że ​​co stanie się logicznie?
Jeśli wartość null jest przekazywana do wywołania zwrotnego
że oznacza to anonimowy Funkcja udało
że tak powiem.
Więc, co powinno serii Metoda poprzedza i teraz nie opiera
na mojej słownej definicji wcześniej?
[Niesłyszalny Uwaga]
Przejść do następnego, tak?
Gdyby wrócił niezerowym wartość, to po prostu przerwać
i nie więcej anonimowy Funkcja będzie się nazywa.
Ale ponieważ nie ma, a następnie to będzie się nazywa następna.
Tak, tu jest logika niemal tak samo, jak przed
i zobaczymy, jak do czyszczenia to się dalej za chwilę.
Zdaję sobie sprawę, jest to rodzaj partii
wchłonąć wszystko werbalnie i wizualnie.
Ale teraz zauważyć, drugi anonimowa funkcja, że ​​chcę
do wykonania w serii jest spróbować odczytać pliku.
Nazywamy to oddzwonienia gdy jesteś gotowy.
Jeśli jest błąd, po prostu sygnalizuje to za pomocą zwrotnego
tak, że reszta te rzeczy przerywa.
Else wartość null powrót.
Ale dlaczego ja przechodzącej w dwóch argumentów?
Tym razem, jeśli dobrze przeczytałem plik i wrócić
jako zmienna o nazwie dane,
Chcę nie tylko oznacza wszystko jest dobrze, wracając wartość null
dla pierwszego argumentu.
Chcę wrócić rzeczywista danych jako drugi argument.
Bo jeśli czytam dalej w dokumentacji,
zauważyć, ten ostatni fragment kodu nawias kwadratowy oznacza, że ​​jest
Koniec serii.
Były tylko dwa anonimowy funkcje w tej serii.
Jeśli był błąd tutaj, a następnie Wiem, że jedno z ogniw
tak w tym łańcuchu mówić nie powiodło się.
Tak więc, innymi słowy, ten błąd będzie przedmiotem Błąd
że jest zerowy jeśli z tych facetów nie powiodło się.
A jeśli tak jest, jestem tylko zamiar wyskoczyć i zamierzam
400, który do powiedzenia oznacza wniosek nie,
to jest bardzo ogólne komunikat o błędzie.
A potem, mam zamiar wydrukować komunikat o błędzie.
Tak więc, nie jestem troszcząc się być super anal tym razem,
Nie idę do odróżnienia od 500 do 404 i 403
Jestem tylko trochę ślepo fala rękę
i powiedzieć, coś poszło nie tak.
Ale jeśli nic nie pomylić,
Mam zamiar wysłać to res.end przekazując te dane.
Teraz wygląda to trochę tajemnicze.
Ale znowu, jeśli czytam dokumentacja,
Drugi argument Ten ostatni, końcowy zwrotna,
Facet, który jest wykonywany tylko po serii odbywa
uruchamianie i część nie o, to będzie tablica
wszystkich drugich argumentów
, które zostały przekazane do wywołania zwrotnego.
Teraz okazuje się, że odwołują się tylko w tej serii
że rzeczywiście powrócić do sekundy argumentem jest ten tutaj.
Więc mam zamiar rozwiązać z dnia skok wiary po prostu użyć załóżmy
do momentu Ostatnia metoda jest
który daje ostatnia elementy tablicy.
Ponieważ ta tablica że to były przekazywane
dla mnie ma dwa indeksów, zero i jeden.
To po prostu nie ma żadnej wartości zerowej bo ten facet wraca -
nie przechodzi w ciągu sekundy argument, ale ten facet robi.
Więc wyniki wspornik zero to nic,
jeden uchwyt wyniki zawiera co,
jeśli już po razem do tej pory?
Plików, komentarzy, Zawartość świat przypuszczalnie
tak to jest jak się rzeczywiście wydrukować go.
I pozwól mi skończyć jeden szczegół tutaj.
Jeśli ja tego rodzaju starych szkoły, jeśli chcą uzyskać
w ostatnich elementów, gdybym mógł do wyników [results.length-1],
to jest coś w rodzaju stary sposób szkoła
uzyskiwania dostępu do ostatniego elementu w - lub zero tablicy indeksu.
Jednak, jak w części, przypominają że miałem tę bibliotekę
tu podkreślenie, które przez Konwencja jest nazywany po prostu
dosłownie podkreślenia charakter, który nie jest wyjątkowy,
to tylko wygląda świetnie, jak znak dolara robi dla jQuery.
To jest tylko pomocnikiem Metoda podkreślenia punkt ostatni
, że robi dokładnie to, samo.
A jeśli nigdy nie używał go zarówno przed podkreślają JS
do kodowania po stronie klienta
i po stronie serwera jest cudownie przydatna biblioteka
że tak wiele osób opisanych to jak jQuery zawiera wszystkie
metod, ludzi pragnie przyszedł z samego JavaScriptu.
OK.
>> Tak, jak dla mnie i całkiem Oglądałem w serii,
masz jak oddzwonienie jako argument?
>> Tak.
>> Podobnie jak podczas Push, że faktycznie jak w,
i jak to, co robi oznacza po prostu
jak callback, a następnie zrobić jak -
[Niesłyszalny Uwaga]
>> OK, dobre pytanie.
Więc pozwól mi wyciągnąć strona główna o asynch
lub dokumentację GetHub.
Więc to jest kanoniczny struktura.
Jeśli masz połączenie z wykorzystaniem tego szczególności seria metoda,
tam dwie duże części do niego.
Jednym z nich jest tablica Funkcje anonimowe
i dwa jest ostateczna zwrotna Funkcja, która jest w rzeczywistości
wykonywane na bardzo Koniec serii.
Teraz, jeśli powiększyć trochę bliżej na pierwszy
z tych wielkich rzeczy, tablicy funkcji anonimowych
przez wymóg ten Facet ma dokumentacji
być anonimowy Funkcja, która wykonuje
w jeden argument o nazwie callback lub foo lub bar, to nie ma znaczenia
ale on dzwoni to oddzwonienie.
I to jest coś w rodzaju swojej brzęczyk że Shake Shack wręcza ci.
To jest sposób, w którym można zwrócić wartość
do klienta, ponieważ może nie tylko nie dosłownie wrócić.
Co musisz zrobić, to przez sposób tego zwrotnego.
Bo jeśli wewnątrz tego Funkcja jest jakiś wolny czas
Kod jak bazy danych kwerendy, przeczytaj plik z systemu plików,
nie chcesz, aby tam czekać i zablokować wszystkich innych,
chcesz zadzwonić do oddzwonienia.
Tak więc, jest dosłownym nazwa argumentu.
Ale tak jak w C, to mają wskaźników funkcji.
W Javie masz Metody systemu odniesienia
i to samo tutaj w JavaScript.
Jest zmienny, ale jej typ jest funkcja.
Więc po prostu przez wpisanie jego nazwy czy zwrotna lub bla
lub bar, a następnie otwarty nawias i zamknij nawias,
wykonywania, że ​​jesteś w tej funkcji.
I zdanie, które null oznacza wartość null, a jeden błąd
co oznacza, że ​​jest to Dane, które chcę przekazać w.
A następnie kawałek być jasne, jest to kolejny oddzwonienia.
I nie nazywa zwrotna,
to jest po prostu koncepcyjnie Funkcja Metoda zwrotna
ponieważ jest nazywany definicji
z biblioteki, gdy tego autora Cała seria została zakończona
lub jego podzbioru, jeśli Błąd działo się wcześniej.
Tak, nazwa funkcji zwrotnej, wywołanie funkcji zwrotnej,
nazwa funkcji zwrotnej, wywołanie funkcji zwrotnej,
inna zwrotna działać razem.
>> Mamy teraz jak zdefiniować callback?
>> Nie, bo ten facet będzie przenikał do tablicy
o funkcje anonimowe,
wskaźnik do kodu chce wykonać.
Dokładnie, wszystko w porządku.
Tak, proszę powiedzieć, że Kod staje się trochę prostsze.
Tak, to możliwe.
I jeśli jesteś podobny do mnie, weź komfort w przynajmniej wiedząc,
to zajmuje trochę czasu, aby przyzwyczaić się do tego.
Ale możemy oczyścić to się trochę,
, aby nie rzucać się za bardzo w tobie ale tutaj jest inna odmiana
i jej innej metody
w tej samej biblioteki zwany wodospad.
Góry, z których jest w przeciwieństwie do serii, gdzie każdy
z tych anonimowy funkcje wykonywane w zasadzie
niezależnie od każdy z pozostałych.
Wodospad, jak sama nazwa wskazuje Pozwala funkcji uppermost
do rodzaju przechodzą w wartości dolnej funkcji
Coś jak kaskady wody.
Więc to góry jest to, że mogę rodzaju
Korzystanie to na moją korzyść.
W async.waterfall, zauważyć, co następuje.
Można po prostu zadzwonić fs.stat przechodzącej w torze
że chcę uzyskać statystyka.
A potem pamiętam, zanim miał funkcję anonimowy
że miał dwa argumenty błędu,
YNIKI a następnie zadzwoniłem Funkcja zwrotna ręcznie?
Mówiąc innymi słowami, to być jasne, przypominam sobie, że wcześniej
w async 2, zrobiłem wszystko tego paskudnego pracy.
Zadzwoniłem fs.stat przeszedł w P,
oświadczył mój własny anonimowy funkcja.
Następnie sprawdzić, czy błąd jest nie jest pusta, a następnie zrobiłem to,
jeszcze ja, że ​​cała Piękno następujące konwencje
jak w node.js jest zwrotna funkcje w ogóle mają
wziąć co najmniej jeden argument, obiekt Błąd następnie zera
lub bardziej użytecznych wartości.
Więc zauważyć paradygmat tutaj
Ta funkcja zwrotna jestem deklarując następuje dokładnie
paradygmat, że ten facet Biblioteka asynchroniczny robi.
To znaczy to, dlaczego jestem I wykonawczych własną oddzwonienia
Metoda, gdy autor tego Biblioteka jest dosłownie wręczając mi
na tacy że tak powiem, Funkcja wywołania zwrotnego można używać?
Więc może po prostu przejść w odwoływać on dał mi
tak, że od razu, moje kilka linii
kodu się jednej linii kodu.
Teraz, gdzie idziemy z tym?
Następna funkcja Chcę wykonać,
następny anonimowy Funkcja tej macierzy
funkcji nie dodaje.
Wskazówka pierwsza stat jest Pierwszy argument.
Więc coś musi zmienił już.
Teraz, ten facet, który napisał biblioteki -
i mówię faceta dlatego, że jest facetem.
Ten facet, który napisał tę bibliotekę Dokumentacja jest gwarancje
że jeśli funkcja ta tutaj mija mnie z powrotem do obiektu Error
lub null, a następnie śpiączki oddzielone lista innych wartości,
będzie upewnić się, że ci, Inne wartości są przekazywane
do tej anonimowej funkcji w kolejności od lewej do prawej.
A co było po prostu Funkcja zwrotna po prostu sam
staje się ostatnio takich argumentów.
Teraz nie wiem, kim ja jestem koncentrując się na tylko wiesz.
Ale teraz, co jest zabrać tutaj?
Tak, wiemy, że od Dokumentacja
lub przed kilka przykładów
że fs.stat ostatecznie oczekuje zwrotna z dwoma argumentami,
Błąd, który obiekt jest Obiekt lub null, a następnie błąd
odniesieniem do statystyki obiekt.
Więc jeśli myślę o tym, Statystyki śpiączka obiekt Błąd sprzeciwu,
który wpisuje się w paradygmat z biblioteki tej osoby.
Więc może po prostu powiedzieć, ponieważ I drugi argument NO
że jest - że się dzieje być przekazywane przez fs.stat
do wywołania zwrotnego jest eee, statystyki według definicji tej bibliotece
Można umieścić drugi Nazwa teoretycznie tutaj
lub cokolwiek można zmienić jego nazwę
jeśli chcę, a następnie przez callback tutaj.
Tak więc, można przekazać jeden wartość od tego tutaj.
Teraz cały ten kod choć Jest wprawdzie nieco tajemnicze
przynajmniej dla Kopiuj Wklej większa część z przed.
Jedyną różnicą jest to informacja tutaj jestem deklarując błąd
obiekt, a teraz chcę się trochę bardziej wyszukane.
I rzeczywiście chcesz wiedzieć, co błędu, więc będę
tuck wewnątrz tego obiektu a Lokale dowolnie nazywane kod
tak, wiem, że nie jest to plik
które powinny być nieuprawnione, to jest HTTP 403.
Pozwól mi pamiętać, że przed I przekazać obiekt Error
do wywołania zwrotnego.
I wtedy wreszcie spróbować odczytać plik, tak w tym przypadku,
Wodospad, Złamałem Kod z dwoma wielkimi krokami
na trzy mniejsze etapy.
Zawiadomienia o piękno,
Mogę zadzwonić fs.readFile przechodzącej w torze.
A następnie Najtrudniejsze psychicznie, jest po prostu przejść
w zwrotnego faceta.
Co on mi polecona, jestem przejdzie do fs.readFile.
Ponieważ wszyscy jesteśmy przylegającą dla tych samych konwencjach
Pierwszym argumentem wywołania zwrotnego jest Błąd lub null, obiekt po
przez śpiączkę lub rozdzielone lista przydatnych rzeczy.
Więc, co to znaczy teraz, a jeśli przeczytaj dokumentację będę wiedział
ta, bardzo ostatnio zwrotna, ten facet tutaj poza
w nawiasach kwadratowych będzie być przekazywane w obiektu Error
lub null, które należy sprawdzić jak zawsze z tego kodu tutaj.
A następnie z definicji tej metodzie
w dokumentacji tego faceta, Ostatnia wartość zwracana
od ostatniej metody w mojej anonimowej tablicy -
moja tablica funkcji anonimowych.
Więc, co ma czytać powrót pliku
i używam zwrotu luźno teraz.
Mam na myśli to, co czyta Karnet plik jako argumenty
metody zwrotną jego ręką?
Dwa argumenty, pierwszy jest Obiekt błąd lub null,
to jest prawie zawsze będzie odpowiedź.
I druga rzecz dzieje za to, co dla pliku czytać?
Zawartość pliku, Dane jak nazwał go wcześniej.
Tak więc, przez zwykłe stwierdzenie eee, spowodować,
i sprawdzić, czy błąd ten jest jakby nudne teraz.
Indziej, ja res.end przechodząc w tym wyniku.
Będzie to niewątpliwie nie doskonale zsynchronizowane
aż faktycznie napisać go samodzielnie.
Ale teraz, weź oddalony co najmniej fakt
że jest to wyraźnie wspólny paradygmat, zgodnie z którym, jeśli
bibliotek i autorzy wszystko jakby kij
z tej konwencji metod zwrotnych.
I pierwszy argument jest Obiekt błąd lub zerowy.
Oraz drugi i trzeci
i czwarty obiekty są rzeczy zależy nam, a my sortowania
z przestrzegania zasad i dokumentacja.
Zaczęliśmy kodu szczerze jest dość brzydki.
I mimo, że najnowsza Przykładem jest szczerze mówiąc trochę trudne
owinąć wokół umysł, to przynajmniej wizualnie,
Wygląda na to, że o wiele mocniej.
A kiedy się komfortowo z tym, że o wiele łatwiej
i to o wiele mniej podatne na błędów niż poprzednim przykładzie.
Więc pozwól mi zademonstrować jedna rzecz tutaj.
To jest wersja trzy.
I - Nie, zostawmy tylko w tym jednym.
Pozwól mi iść do pary Ostatnie rzeczy jak inne zajawka.
W porządku, więc w serwerze 2.
OK. Po pierwsze, wszelkie pytania, Wiem, że to dużo
ale chciał więcej instrukcje, tak?
Nie znaczy dobry Instrukcja koniecznie.
Tak?
[Niesłyszalny Uwaga]
Poprawne, jesteś w istocie łagodne do systemu operacyjnego
aby dowiedzieć się, jak pogodzić wszystkie te kulki na raz,
czytanie z pliku, odczytywania bazy danych.
I to jest ten serwer JavaScript Sam to jednowątkowej.
I zasadniczo i faktycznie,
jest jeden obraz Nie rzucać,
i to nie koniecznie wszystko to pouczające
ale może damy Ci modelu psychicznego.
JavaScript sama i węzeł
w szczególności ma to tzw. pętla zdarzeń.
Przy czym można myśleć z node.js, program,
jest dosłownie jak nieskończonej pętli.
To jest po prostu dziki pętli, czeka i czeka i czeka,
poszukuje zadań do wykonania.
I zadania, które mogą być, przejdź pobrać coś z bazy danych
lub tutaj wartość z bazy danych lub przejdź się ten plik
z dysku lub tutaj zażądać od użytkownika.
Każdy rodzaj imprezy, podobnie jak Impreza przeglądarek napędzane,
, tak jak serwer Impreza boczne napędzane.
I każda z tych rzeczy, stanowią wydarzenia.
Więc ktoś w node.js, tylko napisał nieskończoną pętlę,
duży dziki pętli, czeka dla rzeczy się wydarzy.
A jak coś się stanie, to kończy się w kolejce, prawda?
Oczywiście, w bazie może zwrócić wartość.
I system plików, robocze System może zwrócić wartość
w przybliżeniu w tym samym czasie ale prawdopodobnie będzie
się, że niektóre zamówienia im.
I node.js będzie mają zasadniczo kolejce
jak wielki tablicy lub wektor, niektóre struktury danych
że buforuje wszystko z tych rzeczy.
Ponieważ może dosłownie tylko obsługiwać jeden z nich w tym samym czasie.
Więc, kiedy deweloper,
pisanie asynchroniczny JavaScript kod za pomocą asynchronicznego
Funkcja, jesteś umożliwiając tym tzw. pętla zdarzeń, aby przejść
do następnego kleszcza, prawda?
Tak więc, o ile natychmiast powrócić jako wszystko
z tych metod asynchronicznych zrobić jak i odczytu pliku stat,
wracają natychmiast bo w końcu oddzwonienia
wróci.
Jak najszybciej powrócić,
co oznacza, że ​​ktoś inny może się pojawiło się w magazynie tutaj
lub, że może się zdejmowana z przodu kolejki tutaj.
Tak więc, istnieje w Fakt serializacji
wszystkiego, co się dzieje,
chociaż wszystkie te rzeczy może się dziać równolegle
w systemie wielowątkowym.
Ale node.js się i Serwer biegały
w jednym wątku.
A strona, która jest na dole t nie koniecznie max
z Twoim komputerem Funkcja jest szczególnie
jeśli masz 16 lub rdzeń nawet komputer 2 rdzeń
i jesteś po prostu działa jedno wystąpienie węzła.
Ale jeśli znowu mam wziąć coś jak 161,
unikać ogromny koszmar bóle głowy, jeśli chodzi
ścigać się warunków i zamki i semafor
prawdziwie i pisania Kod wielowątkowy,
tak Plusy i minusy.
OK. Więc z powrotem do kodu tutaj, chciałbym zaproponować, aby zacząć
uproszczenie rzeczy trochę.
Widzieliśmy jeden serwer trochę temu, który wyglądał tak.
Tak, to zapewne całkiem proste.
Ale tak jak w świecie PHP istnieją ramy
jak Laravel i tam rzeczy takie jak Rails i Django,
samo w node.js świata.
I będziemy wydawać więcej Czas na to w środę
oraz w kolejnym projekcie.
Ale jeśli pójdę do Serwer 2 katalog,
zauważyć kilka paradygmatów tutaj.
Tak to jest - nie będzie być równoważne Przykład
ale to za pomocą Ramy nazywa express.js,
który jest darmowy, open source oprogramowanie, takie jak Rails i Django,
jak Laravel, to tak ostatecznie będzie
być niedoceniona dzisiaj Bo byliśmy na piśmie
takie proste przykłady.
Ale zaufaj nam.
To będzie bardzo szybko stać się twoim przyjacielem
ponieważ będzie to zaoszczędzić Ci dużo kodu TDS.
I wspólny paradygmat express.js aplikacja jest
mieć app.js lub server.js Plik, który zawiera logikę
z programu lub przy najmniej punkt wejścia.
Możesz mieć kilka plików.
Węzeł modułu podkatalogu która ma bibliotek
Po pobraniu jak async
i wyrażać się w innych.
A następnie package.json, package.json wygląda tak,
i można go utworzyć ręcznie lub narzędzia stworzyć go dla Ciebie
i to dosłownie plik json
i interesujący jest tu zależności.
Podobnie jak w Laravel, ty miał, że katalog sprzedawca
i trzeba było się martwić, o opakowaniach i robi -
faktycznie aktualizacji z Artisan lub podobne polecenia,
bibliotek, zainstalowany,
podobnie z package.json tutaj i zarządzanie bibliotekami
a wersje że Ci zależy.
Więc, jeśli mam package.json, Mogę po prostu zrobić KMP,
Węzeł Pakiet Manger instalacji, to będzie automatycznie szukać
w tym pliku package.json.
Spojrzeć i zobaczyć, czy ja masz najnowszą wersję
wszystkich modułów sprzedawców
w węźle podkreślają moduły katalog tutaj, a może
w niektórych rodziców lub katalog przodek.
A jeśli nie, to będzie je pobrać
i zobaczysz całą masę
rzeczy HTTP dzieje na drut.
Tak na przykład, niech mi pokazać zawartość
modułów węzła tylko wyrazić.
Pozwólcie mi iść do przodu i śmiało usunąć moduły węzła
tak, że wszystko, co mam teraz to.
A jeśli mam KMP instalacji, będziesz zobaczyć, że to będzie czytać
że plik package.json i widzieliśmy wyjście podobne
W tym celu na świecie Laravel.
To pobieranie całość kilka rzeczy i to jest
bo z kolei ekspresowej zależy cała masa
z innych bibliotek narodami.
Tak więc, wszystkie te są w rodzaju pobierane są rekurencyjnie.
Do tej pory, jeśli zrobić w LS ponownie,
tam jest moje moduły węzła katalog z powrotem
i wyrazić, jak z powrotem.
Więc to jest po prostu sposobem na uproszczenie zarządzania pakietami.
Teraz, jeśli spojrzymy na app.js plik, to będzie
jest powrót do nasz serwer WWW najwcześniej
gdzie tylko pluć na "Witaj, świecie".
Ale zauważ tutaj paradygmaty,
najpierw wymaga wyraźnej Moduł, to mamy tę linię
kodu, które znasz z dokumentacją.
Można dosłownie traktować, że zmiennego modułu jako funkcja
tak blisko otwarty nawias nawias oznacza wykonanie go.
Że będzie widocznie coś Jedziemy z powrotem
ogólnie nazwać aplikację.
Jak to działa?
I naprawdę nie wiem.
Powiem ktoś inny, wiesz, w wyraźnej świecie napisać, że.
Zamierzam teraz stanąć na jego ramiona, tak
aby mój wniosek działa trochę prostsze.
Tutaj mam zamiar słuchać na danym porcie
które mogą być najbardziej cokolwiek.
I tutaj jest kod, który jest może bardziej przypomina teraz
z Laravel i routes.php.
Więc to jest kolacja proste, jestem po prostu będzie określić trasy
dla gwiazdy slash, więc wszystko będzie absorbowany
przez tego żądania obsługi.
Paradygmat dla obsługi żądania Funkcja jest jego anonimowy
z prośbą argumentu
i obiekt odpowiedzi tak jak wcześniej.
I res.send w drodze ekspresowej wysłać kod a następnie
przez co chcesz wysłać.
I oczywiście, można zrobić coś hodowcy
przez faktycznie wysyłanie pliki lub HTML
lub generowana dynamicznie zawartość.
Ale na razie, wszystko zrobiliśmy było wypluć Witaj, świecie.
Jeśli idziemy do serwera trzy, to jest po prostu nawet hodowcy
pokazać niektóre funkcje.
A my wam pokazać nawet bardziej sexy wersja
z tego w środę.
Ale jeśli kiedykolwiek słyszałem Socket IO może być,
tak, myślę, że Jonathan czy ktoś powiedział wcześniej,
jedną z rzeczy, Węzeł jest bardzo znany
w czasie rzeczywistym jest jego zachowanie, prawda?
Pomyśl o PHP w MySQL, jeśli były do ​​wdrożenia serwer czatu
w PHP, w którym dwoje ludzi może otworzyć okno przeglądarki do foo.com
a następnie uruchomić Iming każdego inne, Alice w jednym oknie,
Bob się ze sobą tak, że każdy z nich widzi jego
lub jej wiadomości w inne okno.
Jak można to zrobić w PHP i MySQL?
Wykorzystania lub niewykorzystania Laravel rodzaju od znaczenia, można mieć
jak plik index.php.
I masz mieć - w W niektórych przypadkach to musi pluć
z postaci, więc nie będzie formularz HTML
Nie twierdzi, że prawdopodobnie za pośrednictwem normalnego składania formularza
ale Ajax chyba, prawda?
Tak więc, na przedstawienia obsługi, więc wpisać w polu tekstowym,
trafisz wprowadzić, a następnie robi wysyłane do serwera za pośrednictwem AJAX.
Co prawda potem zrobić na serwerze?
Tak, masz index.php
PHP czy coś to jest kropka otrzymał w parametru HTTP
od użytkownika, Alice i Bob wiadomości błyskawicznych, co robisz
z nim w celu jej propagowania Alicji do Boba lub odpowiednio?
Mam na myśli dosłownie mieć narzędzia, z którym
to zrobić w minutę.
Tak jak co byś zrobił?
Masz minutę na wdrożenia tego programu.
Tak?
[Niesłyszalny Uwaga]
Idealny. Dobra, więc masz bazę danych.
Wiemy niewiele nieco o MySQL.
Tak, masz tabelę to wiadomości,
Może jest czas znaczek, identyfikator użytkownika,
Treść wiadomości Sam stworzył, że
aktualizowane, że i to wszystko.
Tak więc, można przechowywać w bazie danych.
I przypuszczam, Alice wysyła Pierwszy komunikat, w jaki sposób dostać się Bob
że wiadomość teraz z bazy?
>> To może być jakiś Ajax odpowiedź, która jest ciągle dzieje
z powrotem do bazy danych Najwięcej dostać [niesłyszalne].
>> Dokładnie.
Więc Boba Kod kto kod jest tak samo jak Alice jest tylko rodzaj
relacji symetrycznej,
Przeglądarka Boba ma jakiś kod Ajax to chyba może być co 30
sekund ciągnąc serwer poprzez Ajax synchronizacji,
tam są nowe wiadomości?
Czy są nowe wiadomości?
Co 30 sekund będzie być rodzaj optymalna
bo ma czekać nawet
jeśli Alice dosłownie właśnie wysłał wiadomość.
Tak, przeglądarka może Boba co drugi hit serwer.
Ale to oznacza, Alice Przeglądarka uderza serwer
co drugi.
Co z Charliem [Przyjęto pisownię]
i David [przyjęto pisownię] i Edward [przyjęto pisownię]
i każdy inny list alfabetu?
Jaki jest problem tego podejścia?
Wiele przebojów nadmiernych -
To znaczy, że jesteś po prostu skutecznie Dozowanie własny wzrok
lub DDOSing, Ukazuje Atak Denial of Service
na własnej stronie internetowej, poprzez wszystkie
tych użytkowników uruchomić JavaScript Kod, który jest po prostu ping
cholery z serwerem nawet jeśli dowolna liczba,
80 procent nikt nie powiedział nic
na czacie.
Ale jesteś po prostu sprawdzając aby upewnić się o takie.
Więc PHP w wielu języki są nie tylko dobre
do komunikacji w czasie rzeczywistym.
Ponieważ w PHP jest wycofaniem ma centralnego pamięci, prawda?
Masz obiektów sesji które tworzy iluzję
centralnego magazynowania, lecz to na każdego użytkownika.
Nie masz pamięć globalną jak to zrobić w Java Servlet
w zna lub w inny ramka działa tak.
Node.js choć, mam globalnej pamięci bo masz
jeden serwer i że "może pamięta, że ​​chce
O wszystkich użytkowników.
A może jeszcze bazę danych.
Ale miłą rzeczą node.js za to, że jest znacznie lepiej
niż coś jak PHP i tworząc złudzenie
z obsługi wielu rzeczy na raz.
A w rzeczywistości, jak w bok, można wdrożenia serwerów czatu w PHP,
ale zazwyczaj nie coś, co nazywa długo sondowania
przy czym nie ping Serwer co drugi.
Pingować serwer, Serwer nie odpowiada na Ciebie
w górę o 30 sekundy, dosłownie siedzi
w pętli, czeka i czeka.
I serwer sprawdza, jeśli tam nowe dane w bazie danych
i tylko raz go pan widzi, "Och, oto wiadomość od Boba "
to odpowiedź na serwerze HTP?
Więc efekt w swojej przeglądarce jest to, że ikona IE lub Mozilla
lub cokolwiek tylko trzyma przędzenie przez 30 sekund w danym czasie.
Ale Plusem jest, nie wiesz Masz 30 żądań połączeń
w ciągu 30 sekund, masz.
Tak to się nazywa długi odpytywania.
Ale jeszcze lepiej w nowoczesnym internecie przeglądarki jest coś, co nazywa
WebSocket, które wziąć CS143,
można skutecznie dokonać A połączenia TCP z klientami
jak przeglądarki na serwerze a następnie powiesić na niej
bez użycia prawie jak wiele zasobów
jak HTTP może tradycyjnie zrobić.
I gniazda IO jest node.js biblioteki
to sprawia, że ​​o wiele łatwiej wykonać połączenia gniazd
Albo złudzeń w starych przeglądarkach
tak aby można było realizować ten Funkcjonalność w czasie rzeczywistym jest.
Tak, o to przykład.
Te rzeczy się góry dostaje nieco bardziej skomplikowane
ale to głównie skopiować i wkleić z dokumentacją socket.io 's.
Oto teraz więcej precyzyjne obsługi żądania.
Jeśli żądanie użytkownika slash, co ja mam plik
jest najwyraźniej służyć do nich?
Index.html.
I jest jakiś nowy rzeczy tutaj strumień
które pokażę ci za chwilę.
Ale to jest po prostu inny sposób
z chwytając złożyć trochę bardziej efektywnie
niż po prostu robi fs.readFile.
To trochę mądrzejszy szczególnie dla dużych plików.
Więc krótko mówiąc, te linie tak, aby służyć
do pliku o nazwie index.html
które teraz zakładają zawiera Formularz HTML, w którym Alice
i Bob mogą komunikować się.
Wreszcie io.sockets.on, więc pochodzi z tej linii tutaj.
Tak, ja tylko czytanie Dokumentacja io.socket daje mi
Dostęp do tzw WebSocket w przeglądarce,
pomiędzy przeglądarką i serwera.
Słucham na specjalne Zdarzenie, które oznacza połączenie
gdy pierwszy użytkownik Serwer próbuje uderza
do otwarcia tego połączenia, jestem Zadzwonię do tego połączenie z powrotem.
A teraz idę wykonać następujące czynności.
Co pięć sekund, co mam zrobić?
Idę do emitowania lub nadawane jeśli pamiętać, zadrapania,
język graficzny by że blokuje transmisję?
Tak, masz zamiar emitować
lub wyzwolić zdarzenie o nazwie arbitralnie z serwera.
I to będzie zawierają Ping wiadomość
i aktualna data.
Tak więc, jest to rzeczywiste czatu, że Alice serwer
i Bob mogą korzystać, ale to coś w rodzaju zautomatyzowanego serwerem czatu
gdzie wiadomości są tylko rodzaj sonaru pingi.
To tylko data w czasach, które są wysyłane co pięć sekund.
Tak więc, jeśli rzeczywiście uruchomić to rzecz - i to jest to.
Aby być jasne, tu, informacja to jest po prostu zalogowaniu tutaj.
Więc pozwól mi włączyć przymknąć oko na to.
Pozwól mi zrobić węzeł app.js.
Pozwólcie mi iść do mojej przeglądarce.
Odśwież stronę domu.
[Pauza]
I pozwól mi zamknąć Inspektora.
Co pięć sekund, mam demonstracji, chociaż nie
interaktywne dla ludzi
z czegoś, co jest dzieje się asynchronicznie.
W zawiadomieniu przeglądarki nie ma ikony przędzenia.
Jest za pomocą hodowcy funkcji Chrome w nowoczesnych przeglądarkach
utrzymanie gniazda Połączenie pod maską
i to jest to, co się nazywa ogólnie model pub / sub,
publikacji / subskrypcji modelu, gdzie nie zrobiliśmy
że dość wyraźnie tutaj.
Ale to, co jest ładne o tym Ogólnie pub / sub paradygmat jest
że można mieć jednego wydawcy.
W tym przypadku centralny serwer, a wszystkie
osobnika przeglądarki są klienci.
Fiber i Bobs z Świat może się do niej zapisać,
więc można przekazywać wiadomości spośród dowolnej liczby użytkowników.
I mimo, że znowu jesteśmy nie widząc, interaktywność,
mieliśmy może 12 linii kodu po prostu to zrobić.
I to chyba nie skok sobie wyobrazić, jak można wzbudzać
z pliku index.html że ma prawdziwy formularza HTML,
trochę kodu jQuery z Ajax, że nie wysyła dzienne
ale po prostu wysyła co Alice lub wpisz Bob do serwera
i serwer będzie przekazywał ją.
I obiecuję dostrzec na tylko jedną rzecz
dokuczać Ci w tym.
Jeśli idziemy do strumienia zerem i jedynką,
zobaczysz kod, który jest po prostu trochę inaczej tutaj.
Tak widziałem go, to alternatywa
do tego, co nazywa się fs.readFile Metoda wcześniej, przy czym,
można powiedzieć, node.js, "Idź Przeczytaj ten plik do pamięci.
Ale czy to wystarczy dać duży mnie kawałek na raz. "
A może wiesz z CS165
lub 161 systemów plików mają różne
Właściwości wydajności.
Warto przeczytać w blokach po 512 bajtów
lub 2 kilobajtów lub cokolwiek.
To jest sposób optymalizacji z powrót sprawy iteracyjnie
tak, że można go pluć się trochę szybciej
do przeglądarki lub kto klient końcowy jest.
Tak ogromna ilość treści dziś i będziemy nurkować
bardziej szczegółowo w środę z Timem [przyjęto pisownię]
szczególnie patrząc na to, jak my może tłumaczyć niektóre z pomysłów
z pierwszej połowy Oczywiście Laravel i modele
w bibliotece, że on sam napisał nazywa Bookshelf.js
która staje się coraz bardziej popularne w społeczności
ponieważ daje większość,
jeśli nie więcej niż Funkcjonalność wymownym
których odzyskanie jest to, że Biblioteka wgląd Laravel,
tak bardziej na to i wiele więcej, jak
rozwijać pełnoprawnym aplikacje w środę.
My zobaczymy potem.