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 krótko omówimy buffer.
Nie jest to moduł, z którego korzystamy poprzez importowanie go, ale jest on dostępny bezpośrednio.
Jest to również rzecz, z której rzadko będziesz korzystał bezpośrednio, ale pojawi ona się w Node później
we wbudowanych modułach, dlatego warto wiedzieć, skąd buffer się bierze i jak mniej więcej działa. Na stronie dokumentacji
możesz zobaczyć, że jest to dosyć rozbudowany moduł, natomiast ja pokażę ci tylko jego podstawy, abyś zrozumiał
o co w tym chodzi.
Buffer powstał w Node.js jeszcze zanim w JavaScript pojawiła się konstrukcja, która pozwalała na manipulowanie
surowymi danymi binarnymi. W JavaScript jest to teraz tzw. TypedArray i buffer w Node.js również po części z niej
korzysta.
Natomiast w Node.js był on już dużo wcześniej zaimplementowany z użyciem modułów C++ i buffer polega na
tym, że jest to nic innego jak bufor, który przechowuje określoną liczbę bajtów surowych danych binarnych,
czyli możemy do niego coś zapisywać i możemy z niego coś odczytywać.
Później, w kolejnej lekcji, kiedy pokażę ci streamy, to będzie to trochę bardziej jasne.
Natomiast teraz spróbujmy sobie skorzystać z takiego buffera.
Jak wspomniałem, nie musimy go importować. Bezpośrednio odwołujemy się do Buffer w pliku i jest on dla nas
dostępny.
I teraz ważne jest to, że nie korzystamy nigdy z new Buffer. Od wersji Node 6.0 korzystamy tylko z takiej klasy jakby
bezpośrednio i z różnych metod, które tutaj są.
Dlatego będę chciał może utworzyć sobie nową zmienną i skorzystamy z metody Buffer.from. Wkleję teraz gotowy kod.
Będzie to wyglądać następująco.
Otóż chcę stworzyć taki nowy bufor z takiego oto stringu.
Napisałem sobie, że w tym zdaniu są jakieś polskie znaki, bo zaraz pokażę ci, o co w tym chodzi.
Natomiast jako drugi parametr podałem kodowanie UTF-8. Jeżeli go nie podamy, to domyślnie jest ono zakładane.
Czyli w tym momencie mówię, że chcę w pamięci przechowywać dane skonwertowane do surowych danych
binarnych i będzie to bufor, który od razu będzie miał długość taką, jak podamy tutaj. Czyli później, kiedy
będę chciał coś do niego dodać,
to nie będziemy mogli zapisać więcej bajtów niż znajduje się tutaj.
I znowu kiedy będziemy chcieli wyświetlić jego treść, to będzie ona domyślnie konwertowana do UTF-8.
Więc teraz, kiedy stworzymy sobie taki bufor, to w console.log możemy go wyświetlić i zobaczmy, co nam się
tutaj pokaże.
I, jak widzisz, w taki sposób zostało to dla nas wyświetlone. Czyli to pokazuje, że ten bufor nie jest stringiem.
Jeżeli chciałbym odczytać to, co w nim się znajduje jako string, czyli tak, jak to zapisałem, to mogę skorzystać
z metody toString.
Jej można tutaj podać kodowanie, ale jeżeli zrobiłem to wcześniej, podając tutaj, to domyślnie będzie z
niego Node korzystał.
No i widzimy, że teraz poprawnie nam się to wyświetliło.
Teraz skorzystamy z innej metody, która do tego bufora spróbuje coś dodać.
Jest to buffer.write. I powiedzmy, że wpiszemy sobie tutaj Lorem ipsum i spróbujemy teraz znowu zrobić console.log. Zobaczysz,
co tutaj się pojawi. I zerknijmy na drugi console.log.
Mamy na początku lorem ipsum, są jakieś polskie znaki.
Czyli to jest to, o czym ci mówiłem.
Taki bufor w momencie tworzenia ma od razu przypisaną stałą liczbę bajtów i nie możemy tutaj nic więcej
dodać.
Czyli w momencie, kiedy wpisałem sobie Lorem ipsum, to na początku zostało to dopisane.
No i teraz jaka jest idea takich buforów?
Otóż wyobraź sobie - i to będziemy jeszcze robić - że odczytuje jakieś pliki z dysku i nie chcemy całego pliku,
który może być duży,
wczytywać do pamięci RAM. To możemy części tego pliku wczytywać do takiego bufora, który istnieje, który
utworzyliśmy. I powiedzmy, że ma on 64 kB. I w momencie, kiedy ten bufor zapełnimy, przesyłany to, co odczytaliśmy
dalej, np. przez internet, i odczytujemy kolejne części tego pliku i wczytujemy do takiego bufora. Czyli dzięki
temu nie musimy wykorzystywać bardzo dużej ilości pamięci operacyjnej.
Mam nadzieję, że rozumiesz, o co w tym chodzi. Natomiast z bufferów w taki bezpośredni sposób rzadko będziesz korzystał.
Teraz na koniec chce ci pokazać, dlaczego tutaj napisałem: "W tym zdaniu są jakieś polskie znaki".
Otóż kodowanie UTF-8 pozwala obsługiwać polskie znaki.
Ale co, gdybyśmy tutaj podali kodowanie np. ASCII, w ten sposób? Zobaczmy. Jak widzisz, polskie znaki w tym momencie
nie działają już poprawnie.
Czyli to pokazuje nam tylko, że kodowanie ma tutaj znaczenie. I zazwyczaj będziemy korzystać z UTF-8.
Natomiast listę wszystkich kodowań, które tutaj można wykorzystać, znajdziesz poniżej.
Zaraz ją znajdę.
Jest to dokładnie w tym miejscu.
Czyli tak jak teraz skorzystałem z ASCII, możemy z UTF-8 i jeszcze z kilku innych.
To natomiast jest na tyle zaawansowana koncepcja, że tak jak wspomniałem, raczej nie będzie z niej bezpośrednio
korzystał. Ale warto wiedzieć, do czego takie buffery służą i zobaczysz, że jeszcze będą one dla nas zwracane.
I czasami kiedy zrobisz sobie console.log jakiejś zmiennej, to będziesz zdziwiony, że wygląda ona w ten
sposób.
Ale to oznacza tylko tyle, że został do nas zwrócony bufor i że ma on wszystkie te metody, jak toString
czy write, a także wiele innych, które są tutaj opisane w tej specyfikacji. Skoro wiesz już, jak mniej więcej
działa buffer i do czego służy, to w kolejnej lekcji pokażę ci, jak działają streamy, które z buforów również
korzystają.