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 tym kursie kilkukrotnie widzieliśmy już zmienne środowiskowe, które są dostępne pod process.env, m.in.
w lekcji o deploymencie na Heroku, gdzie mogliśmy je sobie ustawić, a także w poprzedniej lekcji o deploymencie
na własnym serwerze VPS.
Ale chcę ci pokazać, jak ty możesz je ustawiać, jak możesz z nich korzystać.
Otóż gdybyśmy sobie wywołali node index, to wszystkie te zmienne będziemy mogli tutaj podejrzeć.
One są różne w zależności od systemu czy nawet od środowiska.
Jak widzisz, tu np. term jest to jakaś zmienna prawdopodobnie z tego iTermu, czyli z mojego programu.
Natomiast jak ustawić swoją, np. zmienną port, gdybyśmy ją chcieli gdzieś tutaj wstawić. Na Linuksie i
na Macu możesz po prostu przed użyciem takiego programu wpisać sobie port 80 i dopiero potem node index.
W ten sposób. I będziemy mieli już w naszym programie Node dostęp do process.env.port.
W ten sposób to się tutaj pojawi.
Natomiast w Windowsie gdybyś chciał coś takiego zrobić, to wpisz sobie set port równa się 80, wciśniesz
Enter i dopiero później, w kolejnym wierszu wpisz node index.
I wtedy taka zmienna również u ciebie się pojawi.
Drugą rzeczą, o której chciałbym teraz powiedzieć, jest wykonywanie procesu node z różnymi flagami. Bo wpisywaliśmy
node index, ale okazuje się, że możesz znaleźć na stronie dokumentacji Node pod command line options
bardzo wiele opcji i część z nich może ci się przydać.
Możemy z nich korzystać.
Jedną z takich opcji jest np. no-deprecation, którą będę chciał ci teraz pokazać. Ale aby móc to zrobić, to musimy sobie
do naszego kodu dodać coś, co będzie nam zgłaszało specjalny właśnie taki warning, czyli ostrzeżenie o tym,
że jakiś kod jest już niezdatny i powinniśmy przestać z niego korzystać.
Pokażę ci, o co chodzi, najlepiej wklejając funkcję.
Wyobraź sobie, że stworzymy jakiś moduł i udostępnimy go światu, ale w którejś jego edycji chcemy zrezygnować
z jakiejś funkcji. Np. mielibyśmy funkcję sum i ktoś z niej korzysta w swoim kodzie.
Ale powiedzmy, że my teraz zmieniliśmy ją albo ona korzysta z jakiejś innej funkcji pod spodem i chcielibyśmy
takiej osobie po prostu dać znać w konsoli, że powinien przestać już korzystać z tej funkcji.
Sam takie ostrzeżenia będziesz mógł zobaczyć.
A więc mamy taką funkcję, ktoś z niej korzysta u siebie - sum 3 i 5. Normalnie zwrócimy mu wynik, czyli ta
funkcja działa.
Ale możemy zrobić coś takiego jak process.emitWarning i napisać mu tutaj wiadomość od nas.
Ja napisałem, że ta funkcja jest już jakby wycofana i użyj funkcji calc.
Chodzi o to, że powiedzmy zrobiliśmy jakąś lepszą funkcję calc.
A jako drugi parametr -
- to jest ważne -
podajemy DeprecationWarning.
To oznacza, że będzie to właśnie takie ostrzeżenie o używaniu już kodu, który jest jakby nieaktualny, powinien
być wycofany.
Zobaczmy, jak to będzie wyglądać, jeśli to wycofamy. Aplikacja komuś takiemu będzie działać lub u ciebie,
jeżeli ty będziesz z czyjegoś kodu korzystał, a ktoś zgłasza ostrzeżenie,
natomiast zobaczy tutaj deprecation warning i to, co my tutaj wpisaliśmy.
Natomiast jedną z takich opcji, którą można skorzystać przy wywoływaniu node, jest to no-deprecation. Chcę ci
pokazać, jak by to wyglądało, gdybyśmy wpisali node no-deprecation i następnie index. To normalnie nam to zadziała
i nie zobaczymy takiego komunikatu.
No i może no-deprecation nie jest aż tak przydatne, ale bardziej przydatne jest throw-deprecation.
Zobacz, co teraz się stanie. Wpiszmy sobie tutaj throw-deprecation.
I teraz, jak widzisz, nie uda nam się wykonać naszego procesu.
Dlatego że gdzieś było zgłoszone ostrzeżenie, a my powiedzieliśmy, że ma je wyrzucać.
To jest przydatne, jeżeli korzystasz z jakichś modułów, jest ich bardzo wiele. Przecież ty do nich do środka
nie będziesz zaglądał, co tam jest, a gdzieś mogłeś pominąć takie ostrzeżenie. Więc wtedy swój program
sobie wykonaj z throw-deprecation.
Jeżeli on się zatrzyma w taki sposób jak tutaj, to będziesz pewien, że ktoś gdzieś sugerował, że nie powinieneś
z jakiejś funkcji korzystać i będziesz mógł zaktualizować swój kod do używania jakiejś nowszej funkcji.
A przy okazji widzisz, jak ty sam możesz zwracać takie oto ostrzeżenie dla innych.
Na sam koniec chciałbym jeszcze tylko wrócić na moment do zmiennych środowiskowych.
Jesteśmy na stronie tutaj dokumentacji Expressa i chciałbym ci pokazać jedną rzecz. Mianowicie tutaj
mamy coś takiego jak view cache.
Być może pamiętasz, jak korzystaliśmy z handlebars i za każdym razem, kiedy ktoś się podłączał od naszej
strony, to te widoki były tak naprawdę od nowa renderowane.
Natomiast możemy ustawić w Express coś takiego, że te widoki będą raz wyrenderowane i później cache'owane.
I teraz dlaczego o tym mówię?
Otóż dlatego, że tutaj pokazuje nam Express, że domyślnie one będą cache'owane tylko jeżeli jesteśmy w takim
environment, czyli w środowisku produkcyjnym. A jeżeli nie, to będzie wartość false.
Teraz mógłbyś zapytać, skąd Express wie, czy jesteśmy w produkcji, czy nie.
Otóż wie to po specjalnej zmiennej środowiskowej, którą możemy znaleźć gdzieś tutaj. Ona była wpisana.
Dokładnie jest to node.env.
Jeżeli ta zmienna środowiskowa będzie miała wartość production, tak jak jest tutaj napisane, to tutaj
może być coś inaczej ustawione. Czyli generalnie jeśli wykonamy nasz program, w którym korzystamy z Expressa
i otrzyma on zmienną środowiskową, która nazywa się node_env i będzie ona miała wartość production, to widzisz,
że może to wpłynąć np. na ustawienie view cache na wartość true.
Jest to zmienna, która przez wiele modułów jest używana.
Dlatego warto o niej wiedzieć i kiedy wykorzystujemy w produkcji nasz kod, to ustawiajmy taką zmienną
jak właśnie node_env na wartość production. W development nie musimy jej ustawiać na wartość development, bo ona
wtedy ma wartość undefined. I w zasadzie większość modułów, które szukają wartości production, jeżeli znajdzie
undefined, no to uzna, że nie jest to po prostu production.
Jak zatem widzisz, ustawianie własnych zmiennych środowiskowych jest proste. Możesz w nich przekazywać
dowolne informacje, takie jak np. production czy development, ale także hasła do bazy danych itd.
A tutaj masz jeszcze wiele innych flag z kolei, z którymi można wywoływać Node. Jeżeli będziesz ciekaw
kiedyś w przyszłości, to możesz tutaj zajrzeć.