w Praktyce
10 godz. 44 min · Node.js · Full-stack i Programowanie
Piotr PalarzWeb DeveloperW kursie tym poznasz platformę Node.js od podstaw, aż po bardziej zaawansowane koncepcje. Zaczniemy od omówienia czym jest Node, a także jakie może być zastosowanie tej technologii. Następnie przejdziemy przez proces instalacji i napisanie swojego pierwszego skryptu. Już na samym początku dokładnie omówimy tworzenie własnych modułów, gdyż jest to wiedza niezbędna, by dobrze zrozumieć funkcjonowanie Node. Następnie dowiesz się czym są zdarzenia, jak działa model “publish / subscribe”, a także czym jest “event-driven development”. Chwilę później omówimy pracę z buforami, stream’ami, a także ze standardowym wejściem i wyjściem. Ta wiedza pozwoli Ci zrozumieć jak tworzone aplikacje mogą otrzymywać od użytkownika dane oraz jak je wyświetlają.
Niezwykle ważnym rozdziałem będzie ten, poświęcony pracy z systemem plików. Szczególnie dla dewelopera, pracującego dotychczas z językiem JavaScript wyłącznie w środowisku przeglądarki internetowej. Node pozwala bowiem tworzyć nowe pliki, zapisywać w nich dane oraz odczytywać i usuwać pliki i katalogi. Przy wszystkich tych operacjach, niezwykle ważna jest jednak asynchroniczna natura Node. Dowiesz się jak działa, a także jakie są jej zalety. Na tym etapie nie zabraknie oczywiście praktycznego projektu, którym będzie aplikacja typu CLI (Command Line Interface). Pozwoli nam ona grupowo zmienić nazwy wielu plików, według podanego wzorca.
W kolejnym rozdziale poruszymy fundamentalną dla Node kwestię, mianowicie tworzenie serwerów sieciowych. Zaczniemy od najniższego poziomu, tworząc prosty serwer bazujący na protokole TCP/IP. Wiedza w jaki sposób Node radzi sobie z takim zadaniem, pozwoli później lepiej zrozumieć wyższe warstwy, takie jak np. HTTP czy WebSockets. Chwilę później stworzymy swój pierwszy serwer HTTP, do którego będzie można wysyłać zapytania wprost z przeglądarki internetowej. Omówimy również jak w Node wykorzystać bezpieczne szyfrowanie HTTPS.Na tym etapie będziesz już miał solidną wiedzę jak pracować z Node, jednak zanim przejdziemy dalej, zatrzymamy się, by omówić jak dokładnie działa Node.js, a także jak ta platforma została zbudowana. Dwie dość obszerne lekcje, będą być może jednymi z najważniejszych w tym kursie. Dowiesz się w nich czym jest, a także jak działa jednowątkowa pętla zdarzeń, czym jest proces i wątek, a także zobaczysz kod źródłowy Node.js i wszystkie bloki budulcowe, z jakich Node się składa. To naszym zdaniem niezwykle ważny temat, często jednak pomijany w wielu materiałach. Dzięki dogłębnemu zrozumieniu jednowątkowej natury języka JavaScript i asynchroniczności Node, będziesz mógł tworzyć dużo lepsze aplikacje.
Node.js posiada kilkanaście wbudowanych modułów, z których w dowolnej chwili można skorzystać. Wszystkie jednak dają nam dużą, niskopoziomową kontrolę, ale czasami sporo kodu należy napisać, by zrealizować jakieś zadanie. Jest to jednak świadomy wybór twórców Node, gdyż całą resztę świetnych rozwiązań, dopisuje nieustannie ogólnoświatowa społeczność deweloperów. Zdecydowana większość z modułów ląduje w rejestrze npm. Jest to genialny package manager, który pozwoli nam wyszukiwać, pobierać i aktualizować niezliczoną ilość modułów. Dowiesz się zatem jak korzystać z npm, a chwilę później zaczniemy wykorzystywać zgromadzone tam moduły w dalszej pracy.Jednym z najpopularniejszych modułów jest express.js, który pozwala w bardzo prosty sposób tworzyć serwery HTTP. Grzechem byłoby zatem z niego nie skorzystać. Dowiesz się wszystkiego co niezbędne, by zacząć tworzyć własne aplikacje bazujące na protokole HTTP z użyciem express.js, a także kilku dodatków do tego systemu. Zobaczysz jak routować zapytania, jak korzystać z middleware czy serwować statyczne pliki. Następnie omówimy współpracę z bazą danych MongoDB i z jej wykorzystaniem stworzymy API typu REST. Stworzona aplikacja pozwoli odczytywać dane z bazy i przesyłać je do klienta w formacie JSON, a także dodawać nowe dane, aktualizować i usuwać je. Wszystko to zgodnie z dobrymi praktykami pracy z REST.
Chwilę później czeka Cię kolejny praktyczny projekt - skracacz linków. Stworzymy wspólnie aplikację, która pozwoli skrócić dowolny adres URL do krótkiej formy. Oczywiście będzie działać również w drugą stronę! Kiedy przejdziemy pod skrócony adres, przekieruje nas do odpowiedniej witryny. Node.js to platforma wręcz stworzona do tworzenia aplikacji typu real-time, dlatego w kolejnym rodziale podejmiemy temat technologii WebSockets. Dowiesz się jakie są jej zalety, a także jak pracować z nią po stronie serwera i klienta. Tutaj czeka nas kolejny praktyczny, niezwykle ciekawy projekt. Wykonamy bowiem czat grupowy. Aplikacja ta pozwoli dowolnej ilości użytkowników podłączyć się do czatu podając swój nick, a następnie wysyłać widoczne dla wszystkich wiadomości. Zaimplementujemy nawet takie rozwiązania jak wyświetlanie statusów o dołączeniu kogoś do czatu, a także o jego opuszczeniu.W przedostatnim rodziale tego kursu podejmiemy tematykę dobrych praktyk pracy z Node.js. Na początku omówimy najważniejsze konstrukcje nowej specyfikacji EcmaScript 2015, które są znakomicie wspierane w Node. Chwilę później omówimy jak korzystanie z Promises uprości, a także ulepszy nasz kod. Wśród dobrych praktyk nie zabraknie również informacji o debugowaniu aplikacji. Zobaczysz sprawdzone sposoby, by znaleźć błędy lub lepiej, krok po kroku, zrozumieć jak działa napisany wcześniej kod. Dowiesz się również jak pracować z błędami, by Twoje aplikacje działały w sposób przewidywalny.
Ostatni rozdział w całości został poświęcony temu, co zwykle jest pomijane w innych materiałach, mianowicie wdrażaniu aplikacji do produkcji. Przez cały ten kurs pracować będziemy lokalnie, lecz kiedy aplikacje są już gotowe, wypadałoby udostępnić je światu. Wdrażanie aplikacji napisanych z użyciem Node.js nie jest jednak tak oczywiste, jak np. wgrywanie WordPress’a u wybranego hostingodawcy. Ty będziesz miał jednak możliwość zobaczyć, jak wdrożyć napisany przez nas grupowy czat na platformie Heroku. Jest to bardzo popularny serwis działający jako PaaS (Platform as a Service). Za darmo będziesz mógł w ciągu kilku chwil uruchomić swoją aplikację.Zobaczysz o co należy zadbać, by wszystko poszło gładko. Serwisy typu PaaS dbają o bardzo wiele aspektów wdrażania i serwowania naszych aplikacji, takich jak bezpieczeństwo oraz nieustanną dostępność. Mają jednak pewne ograniczenia. Z tego powodu, dowiesz się również jak wdrożyć swoją aplikację na serwerze wirtualnym VPS z systemem Ubuntu Server. Takie rozwiązanie daje nam całkowitą kontrolę, ale także obarczone jest większą odpowiedzialnością. Zaczniemy od instalacji na serwerze platformy Node.js, systemu kontroli wersji GIT, a także innych niezbędnych modułów
Następnie zobaczysz jak skonfigurować swoje lokalne środowisko tak, by za pomocą GIT’a wysyłać kod do zdalnego serwera, a potem jednym poleceniem wdrażać go do produkcji. Dowiesz się również jak jednocześnie serwować wersję produkcyjną oraz developmencką. W rodziale tym poruszymy również inne kwestie, takie jak procesy potomne czy tworzenie klastrów. Dzięki tej wiedzy, będziesz mógł maksymalnie wykorzystać dostępne zasoby serwera. Na sam koniec tego kursu rzucimy okiem również na inne, nie przedstawione wcześniej zastosowania Node, a także nakreślimy dalszą drogę nauki w tym zakresie.
Kurs ten jest dla wszystkich osób, które dobrze czują się w technologiach frontendowych, tj. HTML, CSS i JavaScript, a teraz chcą rozpocząć swoją przygodę z back-endem. Im zatem lepiej znasz język JavaScript, tym więcej wyciśniesz z Node, natomiast nie jest wymagana bardzo zaawansowana wiedza z zakresu tego języka.
Tą lekcją rozpoczynamy kolejny dział, tym razem poświęcony bardzo ważnej koncepcji w Node, a mianowicie
pracy z systemem plików.
Konkretnie będziemy omawiać jeden z wbudowanych modułów Node.js, który nazywa się file system i mogłeś go już
zobaczyć w lekcji na temat streamów.
W tej lekcji pokażę ci najważniejsze metody, które pozwolą nam odczytywać informacje o plikach, sprawdzać,
czy jakiś plik istnieje, czy też nie, a także odczytywać zawartość katalogów. I pokażę ci kilka przykładów
takiego użycia.
Dlatego przejdźmy sobie od razu do kodu.
Jak widzisz, na razie nic tutaj nie mam, ale będę chciał sobie zaimportować moduł fs, czyli file system.
Tutaj jest jego dokumentacja. Nie omówimy wszystkich metod, natomiast tak jak zawsze polecam ci, abyś później
się z nimi zapoznał.
Nie wszystkie będą ci zazwyczaj potrzebne.
Dlatego na początek utworzymy zmienną, nazwę ją fs, ale znowu dowolnie można ją nazwać. I następnie
require("fs").
W ten sposób file system możemy sobie zaimportować. Natomiast będziemy do pracy za moment potrzebowali
jeszcze jednego modułu, który również już widziałeś.
Jest to moduł path. On nam trochę pomoże. Dlatego utworzę kolejną stałą.
Tym razem path. I znowu znaną nam funkcją taki moduł zaimportujemy.
Czyli coś już sobie zaczęliśmy, a teraz przejdziemy do poszczególnych metod.
Zauważ, że w katalogu jedenastym, w którym teraz jesteśmy, tutaj, mamy katalog files i w nim trzy pliki
lorem, w których mamy taki przykładowy tekst lorem ipsum. I będziemy na tych plikach chcieli teraz pracować.
Pierwszą z metod, którą pokażę ci w tej lekcji, jest metoda exists, która pozwoli nam określić, czy dany
plik istnieje, czy też nie.
I będziemy chcieli sprawdzić, czy plik w katalogu files o nazwie lorem1.txt istnieje, dlatego zrobimy
to w ten sposób. Odwołamy się do fs zaimportowanego tutaj i następnie metoda exists. I teraz to, co jest
bardzo ważne, to jest to metoda asynchroniczna.
To oznacza, że tutaj będziemy musieli podać ścieżkę do pliku, który chcemy sprawdzić.
A jako drugi parametr podamy callback. Jest to funkcja, która przyjmie jeden parametr, możemy go nazwać
exists.
W ten sposób. I on będzie miał wartość true lub false,w zależności od tego, czy istnieje taki plik, czy
też nie.
Czyli tutaj nie będziemy mieli błędów w tej funkcji, tak jak w niektórych do tej pory już się pojawiały
i jeszcze będą.
Ale tutaj będzie true lub false.
Na początek podamy sobie ścieżkę do takiego pliku. I dlatego zaimportowałem moduł path, że będziemy chcieli sobie
z niego skorzystać.
Teoretycznie będąc w tym katalogu, możemy sobie spokojnie skorzystać z dirname - to już znasz.
W ten sposób. Do tego możemy sobie dodać /files i następnie /lorem1.txt.
Powinno to zadziałać.
Natomiast ważne jest to, że w różnych systemach operacyjnych mamy różne separatory. Czyli to jest separator ścieżki
i jeżeli chcemy mieć pewność, że wszystko będzie poprawnie działać, to najlepiej skorzystać z takiej metody
pomocniczej, która jest w module path, i ona nazywa się join. Dlatego teraz będę chciał z niej skorzystać.
Ale zanim to zrobimy, przejdźmy sobie jeszcze tutaj do konsoli, do terminala.
Przejdziemy do node, czyli interfejs REPL, i będę chciał pokazać jedną ciekawą rzecz. Otóż pokazywałem ci
w lekcji o REPL-u, że jeżeli wciśniemy tutaj Tab, to wyświetli nam się lista wszystkich globalnych zmiennych,
do jakich możemy się odwołać. I zauważ, że niektóre zmienne, takie jak np. fs, czyli file system, albo np. path
są tutaj od razu dostępne. A to oznacza tylko tyle, że w tym interfejsie REPL nie musimy robić sobie require,
tak jak to zrobiłem tutaj, aby z czegoś korzystać,
ale możemy od razu z takiego modułu wbudowanego skorzystać. A więc path dla nas jest od razu dostępne i chciałbym
ci pokazać, że moduł path zawiera taką właściwość jak sep i jest to separator. I w różnych systemach,
np. w Windowsie może to być inny separator - w drugą stronę - i w różnych systemach operacyjnych, na których
działa Node,
może to wyglądać inaczej. Dlatego teraz wyjdziemy sobie z tego interfejsu i tutaj zamiast to dodawać w taki sposób,
to skorzystamy z modułu path, czyli napiszę tutaj path.join - tak nazywa się ta metoda - i jej możemy przekazać
dowolną liczbę parametrów, które zostaną połączone w poprawną ścieżkę.
Dlatego przekażę jej dirname, następnie files.
Zauważ, że bez żadnych slashy to tutaj podaję. I następnie nazwę pliku, który mnie interesuje, czyli
lorem1.txt.
W ten sposób path.join połączy to wszystko odpowiednim separatorem i zwróci nam do tej metody już exists.
Więc tutaj możemy sobie wyświetlić, czy taki plik istnieje, czy też nie.
Za pomocą console.log będzie to wyglądać następująco. Tak jak wspominałem, tutaj będziemy mieli true lub false.
Spróbujmy sobie teraz wywołać poprzez node index naszą aplikację.
I widzimy - plik istnieje. Natomiast gdybym teraz podał nazwę pliku, którego nie ma, np. lorem4, to powinniśmy
mieć sytuację odwrotną, czyli plik nie istnieje.
A więc wszystko póki co działa.
Wiesz już zatem, jak sprawdzać, czy dany plik istnieje, czy też nie.
Natomiast raz jeszcze bardzo istotne jest tutaj to, że ta funkcja jest asynchroniczna, czyli ona się
wywołuje po jakimś czasie. Widzisz, że jest to wszystko bardzo szybko wykonywane.
Natomiast gdybyśmy mieli w kontekście serwera uruchomiony taki program, jak mamy tutaj, to tak naprawdę
bardzo wiele połączeń może być naraz wykonywanych.
I one będą wszystkie chciały sprawdzić, czy dany plik istnieje, czy też nie.
Dlatego to wcale nie musi się wykonać jakoś błyskawicznie.
Nie mam tutaj na myśli, że będziemy musieli sekundę na to poczekać, ale mam na myśli fakt, że jeżeli tutaj
zrobię console.log i wpiszę coś takiego, czyli "To wykona się przed wyświetleniem, czy plik istnieje", to
zobaczysz, że faktycznie tak się stanie.
Zobacz. Mamy najpierw console.log, a potem "Plik istnieje".
To nam tutaj udowadnia, że ta metoda była asynchroniczna.
Czyli ta funkcja wykonała się dopiero po jakimś czasie.
A dużo wcześniej wykonał się console.log, który był poniżej. To wszystko zrozumiesz
dużo, dużo lepiej w rozdziale, w którym wytłumaczę ci dokładnie, jak pod spodem działa Node.
Ale na razie przygotowuję cię do tego, abyśmy mogli tamten rozdział dobrze zrozumieć.
Teraz przejdźmy sobie do kolejnej metody i będzie to metoda, która nazywa się stat i pozwoli nam odczytać informacje
na temat plików lub katalogów.
Pozwolę sobie tutaj wkleić gotowy kod.
Tak to będzie wyglądać.
Otóż metoda nazywa się stat i znowu jako pierwszy parametr podajemy jej ścieżkę do pliku.
Zrobiłem dokładnie to samo, co w metodzie exists, tylko mamy tutaj plik lorem2. I tym razem znowu podajemy
callback, ale on jako pierwszy parametr przyjmuje błąd, jeżeli on wystąpi, a jako drugi obiekt stats, do
którego za moment się odwołamy.
Tutaj tylko jedna ważna uwaga. Dobrze, abyś to zapamiętał.
Taka funkcja callback nazywa się error-first callback.
Jeżeli spotkasz się z taką terminologią, to oznacza tylko tyle, że podajemy sobie tutaj funkcję, która
jeżeli wystąpił błąd, to przyjmie go pod pierwszym parametrem.
Jeżeli takiego błędu nie było, to będzie tutaj pod err wartość null. Natomiast jako drugi lub kolejne parametry
przyjmuje już jakieś dane. W Node
często takie funkcje error-first callback będą się pojawiać i my również będziemy podobne funkcje tworzyć.
Czyli jeżeli wystąpił błąd,
sprawdzam sobie tutaj fm, to będę chciał wyświetlić jego właściwość message, jaki był to błąd i następnie będę
chciał zrobić throw error. Czyli w tym przypadku tego błędu nie obsługuję, a więc, jak wiesz, nasz proces się
zakończy.
Gdyby to był serwer, to cały nasz serwer by padł.
Więc nie jest dobrym rozwiązaniem robienie takiego throw error. Lepiej by tutaj było jakoś inaczej obsłużyć ten
błąd.
Ale dla przykładu naszej aplikacji jeżeli będzie błąd, to chcę go wyrzucić i zakończyć proces, więc nie
przejdziemy poniżej.
Natomiast jeżeli nie było błędu, to dotrzemy w to miejsce i będę chciał odwołać się do tego obiektu stats,
który jest tutaj, i do różnych jego właściwości. Nie muszę ich opisywać, dlatego że, jak widzisz, w console logach
już wpisałem, co każdy z nich oznacza. Jest ich jeszcze więcej.
Przede wszystkim mamy tutaj metody, takie jak isFile, czyli możemy sprawdzić, czy ten dany plik to jest plik,
czy może jest to katalog. Dlatego, że również możemy tutaj podać ścieżkę do katalogu. I takich metod i
właściwości jest więcej. Pokażę ci je teraz. Tutaj mamy coś takiego jak fs.Stats. Możemy tutaj kliknąć i
zobaczysz wszystkie metody, które są dostępne na takim obiekcie, i również wszystkie właściwości. Ja do części
z nich się odwołałem,
jak widziałeś, np. do birthtime.
Natomiast jest ich tutaj więcej.
Zerknij sobie, gdybyś kiedyś którejś z nich potrzebował. Znowu jest to metoda asynchroniczna, więc ten console.log
pod spodem wykona się wcześniej. Możemy sobie to sprawdzić. Wykonajmy node index, no i widzimy najpierw
mamy te poprzednie console logi, natomiast teraz wykonały się nasze kolejne. Ale znowu zauważ ciekawą
rzecz. Otóż obydwa console logi, zarówno ten, jak i ten console.log zdążyły się wykonać, zanim wykonały się
zarówno metoda exists, jak i stats.
Więc może to wykomentujemy, żebyśmy mieli trochę czystą sytuację. I zobaczmy. Widzimy - to wykona się przed
wyświetleniem statystyk, a następnie widzimy wszystkie z console logów, które sobie chciałem wyświetlić.
Jedna jeszcze na koniec bardzo ważna uwaga jest taka, że jeżeli odwołujemy się np. birthtime, to nie jest
tutaj zwracany string.
Mam na myśli, że to nie będzie data w formie stringu, chociaż ona tutaj została tak wyświetlona, ale jest
to normalny obiekt date, taki jak w JavaScript można utworzyć za pomocą new date. A to oznacza, że możesz
tutaj po birthtime odwołać się do dowolnej metody, którą ma obiekt date, np. getFullYear.
W ten sposób ta metoda wygląda.
Możesz sobie wyświetlić dokładnie wszystko, co jest z datą związane. I teraz na koniec pokażę ci jeszcze trzecią
metodę w tej lekcji, która będzie służyć do odczytywania zawartości katalogu. Wkleję ją sobie
tutaj, w tym miejscu.
Metoda ta nazywa się readdir, czyli odczytaj katalog. Aby to było wszystko lepiej widoczne, powiększę sobie okno.
W ten sposób. I teraz jak ona wygląda. Znowu jako pierwszy parametr przyjmuje ścieżkę do katalogu, a jako drugi
parametr error-first callback, czyli funkcję zwrotną, która znowu jako pierwszy parametr będzie mieć błąd,
jeżeli wystąpi, a jako drugi będzie mieć tablicę z wszystkimi plikami. Tylko teraz super ważne jest to, abyś sobie
u siebie wyświetlał console.log(files) i zobaczysz, na czym to polega.
Może ja też to zrobię, a tutaj zrobimy return, aby nie zobaczyć tego, co jest poniżej.
Ok. Wywołajmy to sobie.
No właśnie. I ta tablica wygląda w ten sposób. Czyli nie jest to tablica jakby z jakimiś obiektami plików,
na których możesz coś zrobić.
Natomiast jest to tablica, w której mamy stringi z nazwami plików, które znajdują się w tym katalogu files,
czyli dokładnie to, co możesz zobaczyć tutaj, a więc są to wyłącznie stringi.
Z tego powodu jeżeli chcemy odczytać jakieś informacje o nich, to musimy to zrobić kolejnymi metodami.
I teraz skoro files jest to tablica, to odwołuję się do metody tablicy forEach i podaję funkcję, która dla każdego
z takich stringów zostanie wywołana, i pod file name będę miał poszczególne stringi z nazwami tych plików.
Dlatego teraz znowu odwołam się do metody fs.stat, którą już poznałeś, i będę chciał podać pełną ścieżkę
do takiego pliku, czyli path.join dirname, "files"
i właśnie ten plik, który z tablicy został sczytany. I następnie znaną nam już metodą będę chciał wyświetlić
o nim informacje.
Tutaj w przypadku daty, tak jak ci pokazywałem, wyświetlimy sobie np. rok kiedy taki plik został utworzony.
Zobaczmy, jak to będzie wyglądać. I możesz zobaczyć, że dla każdego z tych plików została wyświetlona
informacja zarówno z nazwą tego pliku, jak i rokiem jego utworzenia. W takim katalogu mogłyby się znajdować
jeszcze inne katalogi i one również zostałyby tutaj zwrócone za pomocą metody readdir.
Dlatego później gdybyś sprawdzał poprzez fs.stat, czy iterował po wszystkich takich plikach, tak jak ja
tutaj zrobiłem, to możesz poprzez fs.stat tutaj w stats sprawdzić sobie, czy dany plik jest plikiem, czy może jest
to jednak katalog w taki sposób, jak pokazałem ci to wyżej, czyli za pomocą metody isDirectory.
Jak zatem zobaczyłeś, Node.js korzysta z asynchronicznych funkcji, czyli takich, które są wywoływane wtedy,
kiedy system odczyta sobie taki plik, a my możemy kontynuować wykonywanie kodu, co było widać np. po tych
console logach.
Natomiast czasami zdarzają się sytuacje, że jest dla nas niesłychanie ważne, aby od razu wczytać sobie coś np.
o zmiennej. Czyli chciałbym stworzyć zmienną stats, np. w ten sposób, i odczytać jakiś plik, a w zasadzie
o nim informacje, i od razu zapisać
je tutaj. Ważna informacja jest taka, że większość z metod, które znajdziesz tutaj w file system, w tym module,
ma swoje odpowiedniki synchroniczne, czyli nie asynchroniczne a synchroniczne. I możemy to znaleźć np. w przypadku
metody stat, która będzie miała na końcu jeszcze nazwę sync.
Poszukajmy tego. Jest dokładnie w tym miejscu. My skorzystaliśmy z fs.stat,
natomiast zauważ, że mamy również metodę fs.statSync. I ważne jest to, że jeżeli jakaś metoda ma swój
odpowiednik synchroniczny, to będzie miała właśnie swoją nazwę i do tego dodamy jeszcze "Sync" tutaj z dużej litery,
czyli w notacji camelCase.
Dlatego teraz pokażę ci, jak możemy z takiej metody skorzystać.
Ona jest tutaj pokazana, ale ja wkleję może gotowy kod poniżej tego kodu. A ten, który mamy tutaj, sobie wykomentuję.
Będzie to wyglądać następująco. I teraz zauważ, że ja wrzuciłem sobie to w blok try catch. O tym jeszcze w
rozdziale o błędach będziemy mówić.
Natomiast ważne jest to, że jeżeli nie uda się odczytać takiego pliku, bo on np. nie będzie istniał, to
zostanie tutaj zwrócony błąd i cały nasz proces się wysypie.
Zauważ, że w przypadku tych funkcji, jeżeli tutaj mieliśmy błąd i ja nic bym z nim nie zrobił, bo ja tutaj
zrobiłem throw error, ale mogłem nic nie zrobić, to normalnie kontynuowalibyśmy wykonywanie naszego programu,
bo w tej funkcji po prostu błąd nie byłby obsłużony. Natomiast w takim przypadku, kiedy korzystamy z
metod synchronicznych, jeżeli tutaj pojawi się błąd, nie mamy żadnej funkcji callback, do której on zostanie
przekazany, to on zostanie po prostu wyrzucony, a to oznacza, że jeżeli nie będziemy wszystkiego mieli
w bloku try catch, to nam się cały proces wysypie. Takiego wywołania jak mamy tutaj nie możemy zawrzeć sobie w tym
miejscu w bloku try catch
z tego powodu, że tutaj nigdzie błąd nie jest wyrzucany, a nawet gdyby był, to dzieje się to w funkcji
callback, która jest dopiero po jakimś czasie wykonywana.
Natomiast w przypadku synchronicznych wywołań jeżeli jest błąd, musimy tutaj go obsłużyć w ten sposób. Ale teraz
dzięki takiemu zapisowi od razu w tej linijce mamy dostęp do tego, co zostało tutaj odczytane, czyli stało
się to w sposób synchroniczny.
Zobaczmy. Jak widzisz, obiekt został tutaj zalogowany przez konsolę i jest to obiekt właśnie stats.
Natomiast jeżeli podam plik, który nie istnieje, np. lorem4, wystąpił błąd, który przechwycimy tutaj w catch i
będę mógł w konsoli wyświetlić informacje o tym błędzie, nie kończąc procesu. Zobacz, on się wyświetlił.
Oczywiście proces sam się zakończył, ale nie z błędem i możesz zobaczyć informację o tym błędzie.
O błędach jeszcze więcej powiemy w tym kursie.
Natomiast z tej lekcji zapamiętaj tyle, że Node ma bardzo wiele metod asynchronicznych i powinniśmy z
nich korzystać.
Dlaczego? To jeszcze wielokrotnie w tym kursie zobaczysz,
bo będzie po prostu dużo szybciej.
Natomiast ma również swoje odpowiedniki synchroniczne i czasami również są one potrzebne do wykorzystania.
I również to zobaczysz jeszcze później.
Ale kiedy korzystasz z metod synchronicznych, to pamiętaj, że musisz obsługiwać błędy za pomocą try catch.