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.
W tej lekcji pokażę ci, w jaki sposób możemy korzystać z routingu, czyli przypisywania odpowiednich ścieżek
czy odpowiednich funkcji do obsługi odpowiednich ścieżek, pod które ktoś może przejść.
Na początek - jesteśmy w katalogu 29 i znowu wpiszmy npm install, żeby pobrać sobie z internetu Express.js.
I po tej akcji możemy nodemonem uruchomić plik index. Serwer, który widzisz tutaj, nam się uruchomi, więc on powinien
działać. Jak najbardziej.
I teraz pokażę ci, w jaki sposób możemy tworzyć kolejne zapytania czy kolejne ścieżki do zapytań. Skopiujemy
sobie to, co mamy tutaj i wkleimy poniżej.
Pewnie cię nie zaskoczę, jeśli pokażę ci, że możemy tutaj wpisać np. o nas i odesłać o nas. Zapiszę to.
Nodemon nam to zrestartuje.
No i mamy - strona główna. Jeżeli przejdziemy o nas, no to mamy o nas.
Jeżeli przejdziemy do ścieżki, która nie istnieje, to mamy błąd 404, co na dole widać. Czyli w ten sposób
możemy tworzyć sobie ścieżki.
One mogą być bardziej zaawansowane, bo tutaj można dopisać jeszcze kolejne człony takiego adresu URL.
Natomiast to, co jest szczególnie ciekawe, to fakt, że możemy tutaj robić dynamiczne parametry i będę chciał ci
to pokazać poniżej.
Będziemy chcieli sobie zrobić nową ścieżkę z wpisami do bloga powiedzmy. Czyli będziemy mieli blog i
następnie chciałbym mieć tutaj datę.
W ten sposób. I możemy zrobić kolejny parametr, będzie to id.
Zauważ, że każdy z takich parametrów poprzedziłem dwukropkiem i to tutaj jest kluczowe. Czyli w tym momencie
będziemy mogli odwołać się do tych poszczególnych parametrów
w tym oto miejscu. Natomiast zamiast odsyłać to w ten sposób, to odeślemy obiekt, dzięki któremu będziemy mogli
to wszystko zobaczyć.
Albo może nawet nie obiekt, bo musielibyśmy korzystać z jsona, ale po prostu template string. Pokazywałem ci już, że
możemy tworzyć stringi z użyciem takich template stringów ECMAScript 6 i to, co jest ich zaletą, to fakt, że możemy je rozłożyć
na kilka linii, więc w ten sposób możemy tutaj to ładnie sformatować.
I teraz chciałbym napisać coś takiego.
Czyli Wpis o id - req.params.id.
I teraz skąd ja to wziąłem?
Otóż odwołując się do req.params, odwołujemy się do tych parametrów z dwukropkiem, które podałem.
I skoro ten nazwałem id, to mogę tutaj po kropce odwołać się do id. Ten nazwałem date, to mogę się odwołać
do date.
Jeżeli nie będzie podany, będzie miał wartość undefined, jeżeli ktoś go nie poda.
Natomiast w tym przypadku nie może go nie podać.
Zobacz, jak to wygląda. Przejdziemy sobie pod blog i powiedzmy, że chciałbym tutaj podać datę jakąkolwiek, powiedzmy
2012-02-03, to będziemy mieli Cannot GET
z tego powodu, że tutaj zadeklarowałem ścieżkę, która ma mieć trzy człony: blog -
ok - jest. Następnie data - jest. Ale nie mam tego ostatniego członu - id.
Więc jeżeli teraz go tutaj dodam, np. 22, no to już jest w porządku, bo taka ścieżka jest poprawna i zobacz,
mamy Wpis o id 22 utworzony i tutaj mamy datę. Czyli możemy sobie odczytywać z adresu dowolne rzeczy właśnie
w taki sposób.
Natomiast gdybyśmy chcieli, aby dany parametr był opcjonalny, to możemy podać tutaj znak zapytania. I w
ten sposób będę mógł zarówno przejść pod adres, który teraz widzisz, jak i pominąć ten ostatni parametr
i będzie w porządku.
Poza tym, że tutaj będę miał wartość undefined. Czyli tak możemy sobie to również sparametryzować.
No i nietrudno się domyślić, że będziemy mogli za pomocą np. takiego ID przekazać sobie tutaj w URL-u jakieś
ID wpisu czy użytkownika.
I tutaj z niego skorzystać, np. wysyłając do bazy danych zapytanie, pobierając sobie użytkownika.
czy wpis o takim ID i coś odsyłając. Ale o tym będzie jeszcze później. Natomiast chcę ci pokazać jeszcze jedną
rzecz, że to, co widzimy tutaj, może mieć również tzw. queer string.
Bo co jeżeli ja sobie w tym miejscu wpiszę taki adres i dodatkowo napiszę jeszcze powiedzmy
search=text i wyślemy.
Nic się tutaj szczególnego nie wydarzy. Ale jeżeli byśmy się odwołali do request i następnie do query,
zróbmy sobie to w consol.log, albo w zasadzie nie traćmy na to czasu, tylko odeślijmy to sobie.
Będzie to obiekt, a skoro jest to obiekt, to możemy go zamienić na tekst za pomocą json.stringify.
Czyli chciałbym tutaj wstawić w HTML-u taki tag pre i w nim json.stringify -
metoda, która pozwoli nam obiekt zamienić na json-a.
Podamy req.query - w ten sposób. Teraz odświeżymy.
No i tak to będzie wyglądać.
Natomiast żeby to było lepiej sformatowane, to json.stringify pozwala jako drugi parametr przyjąć funkcję,
więc podam null, bo nie chcę funkcji, a jako trzeci parametr pozwala podać ilość spacji jako wcięcia.
No i teraz będzie to ładnie sformatowane, czyli search text. I znowu w przypadku modułu HTTPS, z którego my wcześniej
korzystaliśmy,
mogliśmy się też odwołać do request i następnie do URL, ale wtedy cały taki adres URL był dla nas zwracany.
Aby wyłuskać wyłącznie to, co widzimy w tym miejscu,
to pokazałem to przy okazji lekcji o pętli zdarzeń. Mogliśmy skorzystać w Node.js z modułu URL i potem
z modułu querystring. Jak widzisz, tutaj jeżeli chodzi o Express,
on to zrobi już za nas. Czyli mogę się odwołać do req.query i po kropce mogę się odwołać do search
np. w tym przypadku, bo podałem tutaj search.
Ja sobie cały ten obiekt wyświetliłem.
Ale widzimy, że jeśli bym się odwołał do .search, to test zostanie dla mnie zwrócone - czy w zasadzie text.
Zapamiętaj tylko tyle, że możemy w ten sposób tworzyć sobie odpowiednie ścieżki, podawać im parametry,
do których można się później odwołać.
One mogą być opcjonalne, natomiast nie podajemy tutaj czegoś takiego jak quertstring, bo on będzie po
prostu automatycznie wysyłany do serwera. I możemy wtedy sprawdzić poprzez req.query, czy coś tam
się znajduje.
A jeżeli tak, to będzie to już odpowiednio sparsowane, więc mogę po kropce się do tego odwołać. W ten sposób
widzisz, jak wiele za nas już zrobił Express, ale tak naprawdę na bazie tego, co Node.js udostępnia na tym
niższym poziomie.