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.
Do tej pory w tym kursie pokazałem ci, jak możemy korzystać z wbudowanych API Node.js np. umożliwiających nam
tworzenie serwera HTTP czy odczytywanie plików.
Jak jednak być może się zorientowałeś, Node.js zawiera niezbyt wielkie API, czyli tak naprawdę tylko te najważniejsze
rzeczy, które dają nam dostęp do niskiego poziomu. Np. tworzenie serwera HTTP
było dosyć skomplikowane, ale dzięki temu mamy nad nim bardzo dużą kontrolę.
Nie bez powodu Node.js jest utrzymywane właśnie w takiej niewielkiej formie.
Jest to robione po to, aby społeczność mogła na bazie tego, co nam Node udostępnia budować własne moduły i
udostępniać je innym.
Przez te wszystkie lata zostało stworzonych tak wiele modułów, że rozwiązują one niemal każdy problem,
z jakim możemy się spotkać i moduły te znajdują się w repozytorium npm
na stronie npmjs.com. Tutaj możesz ich wyszukiwać. Natomiast od razu powiem ci, że
z mojego doświadczenia wynika, że lepiej szukać w Google. Czyli będziemy później w tym kursie potrzebować np. w Node.js wygenerować
sobie randomowy string.
Nie będziemy myśleć, jak możemy w JavaScript to napisać, wyszukamy sobie moduł. To łatwiej jest wpisać w Google
po prostu npm random string i zostanie odpowiedni moduł znaleziony.
Oczywiście możesz szukać również w tym miejscu. W tej lekcji będziemy chcieli skorzystać natomiast z modułu
del.
Wiem, jak on się nazywa, dlatego go tutaj wpiszę. Przejdziemy od razu na jego stronę, ale wrócimy do tego
dopiero za sekundę.
Przejdziemy teraz do terminala w przykładzie 24 i pokażę ci, że oprócz Node, kiedy instalowaliśmy tę platformę,
zainstalował nam się również npm, który jest jedną z zależności Node.
I widzieliśmy to też w kodzie źródłowym na GitHubie. Za pomocą npm będziemy mogli instalować moduły, ale najpierw
potrzebujemy pliku package.json.
Dlatego wpiszemy sobie npm init
i za pomocą tego polecenia możemy stworzyć plik package.json.
Tutaj będzie seria pytań i nieważne jest aż tak bardzo, co tutaj odpowiemy.
Z tego powodu, że te informacje są ważne, kiedy kod, który napiszemy, chcemy później umieścić właśnie w
tym repozytorium npm.
No to wtedy ważne jest, aby ten plik dobrze uzupełnić.
My natomiast nie będziemy tego nigdzie publikować, dlatego name wpiszemy sobie tak, jak nam podaje w nawiasie:
24 wersja 1.
Opisu nie dajemy. Entry point - index, tutaj nie wpisuję, Gita nie podaję, nic więcej.
Autora możemy wpisać, nie musimy.
Licencja domyśla.
No i tutaj pokazuje nam, jak tam plik będzie wyglądał, wciskam Enter i plik został utworzony.
Jeżeli wpiszę ls, to on się pojawi. Jeżeli przejdziemy do edytora,
to ten plik rzeczywiście tutaj jest. I z tym plikiem w naszym folderze możemy już przejść do instalacji
właśnie np. takiego modułu jak mamy tutaj, czyli modułu del. Aby taki moduł zainstalować,
bardzo prosta sprawa, tutaj mamy pokazane, jak to zrobić. Wpisujemy npm install del.
Ważne jest, żebyśmy byli w tym katalogu, do którego chcemy go zainstalować, czyli
npm install del. Zostanie wszystko pobrane z internetu, a co dokładnie, to zobaczysz za moment.
Już to się stało i teraz jeżeli wpiszę ls, to pojawił nam się nowy katalog node_modules.
Dlatego przejdźmy do edytora, zobaczmy, co w tym katalogu jest.
Jesteśmy tutaj.
Katalog mi się nie pokazuje, dlatego że ja mam wykluczone, aby mi w Sublime tekstu nie pokazywało. Włączę to teraz. Ok.
I ten katalog nam się już pojawił.
I zauważ, że myśleliśmy, że w środku będzie tylko jeden moduł - del. A okazuje się, że owszem, ten moduł jest
w tym miejscu, ale on sobie korzysta z jakichś innych modułów.
I chociaż tutaj widzimy moduł path wbudowany w Node, to na przykład taki moduł jak is-path-cwd - nie widzieliśmy
takiego modułu.
No właśnie. Bo nie jest to moduł Node, jest to moduł, który również został pobrany z npm.
Czyli to, co jest niezwykle istotne, to taki del ma plik package.json i w nim ma napisane - tutaj pod
dependencies znajdziemy - wszystkie zależności, jakie są mu potrzebne. Czyli kiedy my go instalowaliśmy,
to npm pobrał jeszcze wszystkie te zależności.
I teraz taki globby znowu może mieć swój plik package.json, w którym ma inne zależności.
I one również będą pobrane.
Niemniej jednak dla nas nie jest to aż tak istotne, bo nie będziemy nic z tym katalogiem tutaj robić.
Ważne jest tylko tyle, że pobraliśmy moduł del i możemy go teraz zaimportować u siebie w pliku index.js.
Jak to zrobimy?
Otóż w taki sam sposób, w jaki importujemy sobie wbudowane moduły Node. Czyli napiszę const, dowolnie nazwę stałą. Nazwę
ją del i wpiszę require("del").
Nasze moduły wcześniej importowaliśmy, podając tutaj do nich ścieżkę i ten del mógłbym zaimportować, wpisując
node modules,
następnie del i tutaj index.js. Ale nie musimy tego robić w ten sposób, bo mamy jeszcze jedną metodę
wyszukiwania przez Node modułów.
Mówiłem ci, że jeżeli wpisujemy coś takiego, to będzie domyślnie szukany plik z rozszerzeniem .js,
jeżeli byłby to nasz moduł. Jeżeli nie ma .js, to jest szukany katalog, w tym katalogu plik index itd.
Już ci to w tym kursie pokazywałem.
Natomiast jeżeli nie podamy żadnej ścieżki, tak jak tutaj, czyli np. wpisywaliśmy fs, to Node sprawdza sobie,
czy ta nazwa znajduje się w tej tablicy, którą - być może pamiętasz - widzieliśmy w kodzie źródłowym Node,
czy jest to jeden z wbudowanych modułów Node.
Jeżeli tak, to go zwróci. Jeżeli nie - tak jak będzie w przypadku del - to szuka katalogu node modules. W tym
katalogu, w którym się znajdujemy.
Jeżeli tutaj nie ma katalogu node modules, to przechodzi o krok wyżej w naszej strukturze plików i tam
szuka tego katalogu i modułu.
Jeżeli nie, to jeszcze wyżej i jeszcze wyżej aż do katalogu root w naszym systemie.
No ale właśnie tutaj znalazł katalog node modules, w środku znalazł folder del, dlatego zaimportował
nam cały ten moduł.
Zanim jednak z niego skorzystamy, to chcę ci pokazać coś, co jest dla ciebie myślę dosyć istotne do zrozumienia
na tym etapie. Mianowicie pokazywałem ci w tym kursie, jak korzystaliśmy, np. z calculatora, że importowaliśmy
go sobie w ten sposób.
Było to na początku tego kursu, może to pamiętasz. Czyli mieliśmy taki plik w tym samym katalogu. Co jeżeli
jednak chcielibyśmy go ponownie w innym module importować gdzieś niżej, to musielibyśmy podawać to w ten
sposób, bo powiedzmy odwoływałoby się do folderu wyżej.
W innym miejscu jeszcze w ten sposób. Czyli jeżeli mamy jakiś moduł, który my napisaliśmy i w wielu miejscach
w innych modułach zagnieżdżonych chcemy się do niego odwoływać, to najlepiej cały ten nasz moduł umieścić
jest w katalogu node_modules.
Nie musisz tworzyć tego pliku package.json, który robiliśmy przed momentem.
Nie musisz korzystać z npm. Po prostu utwórz sobie katalog node_modules i do niego wrzuć taki calculator. I wtedy
będziesz mógł go importować bez podawania ścieżki właśnie w dowolnym miejscu w taki sposób, bo będzie
sprawdzane, czy jest to wbudowany moduł Node.
Nie jest, więc będzie szukany katalog node__modules.
Tak jak ci to pokazałem przed momentem.
Czyli warto również w swoich przykładach z tego korzystać, jeżeli mamy moduł, z którego w wielu miejscach
korzystamy.
Wtedy na samej górze stwórz katalog node__modules, a wszystkie moduły, które będą gdziekolwiek poniżej, będą
potrafiły znaleźć takiego calculatora.
Wracając jednak do modułu del, zaimportowaliśmy go i teraz chcę ci pokazać, jak można z niego skorzystać. W tym
kursie pokazywałem ci, jak można usuwać pliki i katalogi. I mieliśmy taki problem, że jeżeli katalog nie był
pusty, to nie mogliśmy go usunąć.
Wtedy napisaliśmy sobie swój przykład, który najpierw usunie wszystkie pliki, a później usunie katalog.
Normalnie jednak nie będziemy takich przykładów pisać, bo mamy do tego świetny moduł del, który pozwoli
nam usunąć właśnie taki katalog. Jak można to zrobić?
Otóż w taki sposób. Odwołuję się do del i podaję mu po prostu files..
Nawet tutaj nie muszę z żadnego modułu path korzystać, mogę taką ścieżkę podać.
Co ciekawe, to mogę również tutaj korzystać z globów. Czyli mógłbym tutaj napisać, że wszystko, co kończy
się np. na txt w ten sposób. A zauważ, że w files mamy trzy pliki z rozszerzeniem txt. Więc już widzimy, że
jest to tutaj ogromna przewaga nad tym modułem, który my napisaliśmy.
No, ale zostawmy to w ten sposób. Jako drugą opcję podaję dryRun true
po to, abyśmy nie usunęli tych plików, bo nie chcę ich tak naprawdę usuwać, ale chcę jedynie wyświetlić,
które z tych plików byłyby usunięte.
Dlatego sobie tutaj wpisałem tę opcję. Ona nie jest konieczna. I później mamy metodę then, która się wykona,
kiedy uda się to wszystko usunąć. Czyli jest to po prostu standardowy callback, który otrzyma paths.
Gdybyś był ciekaw, dlaczego w ten sposób się to wykonuje, to po prostu przejdź sobie do przykładu, gdzie mamy usage.
No i zobaczysz, jak korzystać z takiego modułu.
W ten sposób to zrobimy.
Jeżeli teraz wykonamy node index, to w konsoli będzie pliki do usunięcia.
Mamy tutaj files, ale plików tak naprawdę w tym momencie nie usunęliśmy.
Gdybym z tego nie skorzystał, gdybym usunął ten fragment, to pliki zostałyby usunięte.
Jak widzisz, jedną linijką moglibyśmy usunąć wszystkie pliki.
Dodatkowo ten moduł na pewno działa dużo lepiej niż nasz moduł, bo bierze pod uwagę dużo więcej tak zwanych
edge case'ów, gdzie coś mogłoby pójść nie tak.
Zapamiętaj zatem, że możemy moduły instalować, wpisując npm install i nazwa modułu. Następnie inkludujemy
je tak samo jak wbudowane moduły Node i w katalogu node__modules będą one wyszukiwane.
One z kolei mają różne swoje zależności.
Teraz chcę ci jednak pokazać, jak możemy taki moduł zainstalować i dopisać go do pliku, który utworzyliśmy, czyli
do package.json, bo tutaj nigdzie on się nie znalazł.
Czyli najpierw go będziemy chcieli odinstalować. I robimy to, wpisując npm uninstall.
W ten sposób. Nazwa modułu - del. On zostanie usunięty i wszystkie jego zależności, dlatego katalog node_modules
będzie pusty.
Tutaj został tylko bin, ale również jest pusty - wszystko zostało usunięte. I teraz raz jeszcze będę chciał
go zainstalować: npm install del, ale podamy taką flagę, dwie kreski, save.
Ona jest bardzo ważna i zazwyczaj powinniśmy z niej korzystać.
Znowu zostanie tak samo zainstalowany del, ale dodatkowo zostanie on dopisany do pliku package.json, który
wcześniej utworzyliśmy pod kluczem dependencies.
Po co jest nam to potrzebne?
Otóż po to, że jeżeli teraz usunąłbym sobie cały katalog node_modules, który mam tutaj, mogę na Macu wpisać
rm - rf node.modules, usuniemy go.
Nie ma tego katalogu.
Gdybym chciał wykonać node index, będziemy mieli błąd, dlatego że nie możemy znaleźć modułu del, ale
mając w pliku package.json wpisane, że chcemy korzystać z tego modułu,
możemy wpisać npm install,
nie podając tutaj nazwy takiego modułu. Czyli możemy naszą aplikację komuś udostępnić bez katalogu
node_modules, w którym jest mnóstwo plików, a tutaj jedynie będą wpisane wszystkie inne zależności, z których
będziemy korzystać.
I ten ktoś
wystarczy, że będąc w tym katalogu, wpisze npm install i npm sprawdzi sobie, co jest w pliku
package.json i wszystko po kolei zainstaluje.
Zobacz. I możemy zobaczyć, że znowu mamy katalog node_modules
i znowu w nim znajduje się del.
Jeśli chciałbyś ten moduł odinstalować i również usunąć go tutaj z dependencies, to sytuacja dokładnie
taka sama:
npm uninstall del save, czyli chcemy go usunąć z katalogu node_modules, ale również usunąć go z package.json,
bo powiedzmy stwierdziliśmy, że nie jest on nam jednak konieczny.
Raz jeszcze go szybko zainstaluję i pokażę ci ostatnią rzecz w tej lekcji. Czyli npm install, musimy teraz
wpisać w del save, aby dopisać to do tego pliku package.json. Zostało to dopisane i mamy tutaj
wersję 2.2.2.
Co gdybyś z jakichś powodów chciał zainstalować wersję np 2.2.0?
Otóż można to zrobić, wpisując npm install, nazwa modułu, czyli dell,
tutaj @ i konkretną wersję, czyli 2.2.0. Ale żeby ona została zainstalowana i tutaj aby zostało to
zmienione, to po raz kolejny wpisujemy save.
Zobaczmy, jak to będzie wyglądać.
No i teraz jeżeli odświeżymy, mamy wersję 2.2.0 i importując tutaj ten moduł, będziemy z takiej właśnie
wersji korzystać.
Jak zatem widzisz, pobieranie modułów z internetu jest bardzo proste. Wystarczy je znaleźć, a o tym, czy
dany moduł jest dobry, czy nie, świadczą m.in. te statystyki. Jeżeli dnia poprzedniego prawie 200 tysięcy
razy pobrano ten moduł, to znaczy, że jest on popularny i najprawdopodobniej dobrze przetestowany i dobrze
działający.