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 krótko, jak możemy pracować z bezpiecznym protokołem HTTPS.
Będzie to wyglądać prawie identycznie jak w przypadku HTTP, niemniej jednak znajdziesz tutaj w Node, w dokumentacji
osobną sekcję HTTPS. Skopiowałem sobie przykład z lekcji poprzedniej, bo będzie on niemal identyczny.
Natomiast abyśmy mogli mieć połączenie szyfrowane, to tutaj musimy sobie zainkludować https.
I tutaj odwołać się też do https, jeżeli sobie to pozmieniamy.
To jest pierwsza rzecz. Natomiast druga i najważniejsza rzecz jest taka, że potrzebujemy pary klucza prywatnego,
a także certyfikatu, abyśmy mogli szyfrować połączenie.
Normalnie taki certyfikat będziesz wykupywał sobie u tzw. certificate authority.
Będzie on podpisany i przeglądarka będzie wyświetlać, tak jak w przypadku tutaj Node, zieloną kłódkę.
Tutaj możemy przejść i więcej sobie o tym poczytać. Jeżeli byśmy sobie kliknęli np. w details, to Chrome nam
to wszystko pokaże i certyfikat możemy sobie tutaj wyświetlić.
Natomiast możesz również uzyskać darmowy certyfikat za pomocą np. Let's Encrypt.
Ale w tej lekcji zrobimy to za pomocą swojego własnego certyfikatu po prostu wygenerowanego. On będzie
działał, połączenie będzie szyfrowane, ale przeglądarka będzie wyświetlać ostrzeżenie, bo ten certyfikat
nie będzie podpisany przez żaden certificate authority, który przeglądarka rozumie.
Dlatego będę chciał sobie takie klucze teraz utworzyć. Na wiele sposobów to można zrobić, ale z uwagi
na fakt, że ja jestem na Macu -
być może ty jesteś np. na Windowsie, to musiałbym na kilku systemach pokazywać, jak to wygenerować- to zrobimy
to za pomocą generatora online. Możemy przejść pod taki adres selfsignedcertificate.com i tutaj sobie wygenerujemy
taki certyfikat. Wpiszmy sobie localhost. I kliknę Generate.
No i teraz od razu mamy właśnie tę parę, o której mówiłem. Czyli po pierwsze klucz prywatny. On jest zawsze
tylko na serwerze, a po drugie certyfikat.
W skrócie jak to działa?
Otóż za każdym razem, gdy podłączamy się do strony https, tak jak to zrobiliśmy tutaj, to serwer, na którym
działa strona nodejs.org wysłał certyfikat do naszej przeglądarki. W tym certyfikacie jest również
klucz publiczny, więc przeglądarka sobie za pomocą tego klucza publicznego pewne informacje zaszyfrowała i
przesłała do serwera, a serwer może te informacje odczytać, dlatego że na serwerze znajduje się klucz
prywatny. Czyli w największym skrócie tak to działa. Nikt nie zna klucza prywatnego, czyli po drodze jeżeli
ktoś chciałby odczytać informacje wysłane przez przeglądarkę, np. gdybyśmy tutaj w jakimś formularzu
wpisali swoją kartę kredytową, nie może tego odczytać, bo nie ma klucza prywatnego.
Pobierzmy sobie teraz te obydwa klucze - klucz i certyfikat.
I teraz ja je przekopiuję sobie do katalogu, w którym jesteśmy - 22. Utworzę tutaj folder cert. Również zrób tak u
siebie. I do tego właśnie folderu wstawię te dwa pliki. Wyrzuciłem je tutaj, ale zmienię sobie jeszcze
ich nazwę.
Może po prostu nazwiemy sobie to localhost cert. I tutaj zmienimy nazwę na localhost key. Ok.
W ten sposób. I teraz musimy je wczytać.
Tutaj będziemy musieli przy createServer
oprócz tej funkcji, która obsługuje każde zapytanie, podać najpierw opcje. Możemy tutaj podać bezpośrednio
obiekt, ale wpiszę options i utworzę sobie wcześniej właśnie taki obiekt z opcjami w tym miejscu. I ten obiekt
musi zawierać dwa klucze.
Po pierwsze będzie to key - mam na myśli dwie właściwości - a po drugie cert.
I teraz musimy sobie z tego katalogu, który mamy tutaj, ten jeden klucz i ten certyfikat odczytać, więc
robimy to za pomocą modułu fs, który tutaj mamy.
I tutaj świetnie nadadzą się metody synchroniczne, więc korzystamy z fs.readFileSync.
Pamiętasz tę metodę.
Ona odczytuje zawartość pliku całkowicie, czyli całą zawartość.
Nie jest to żaden stream i zwróci nam ją od razu tutaj.
Robimy to synchronicznie, bo inaczej by nam to nie zadziałało, gdybyśmy podawali callback. I teraz za pomocą
path.join będziemy chcieli połączyć dirname, w którym jesteśmy, z katalogiem cert i następnie z nazwą - w naszym przypadku
localhost
.key
I dokładnie to samo musimy sobie zrobić dla localhost.cert.
Natomiast tutaj podamy cert. Czyli takie dwa klucze, takie dwie właściwości key oraz cert są tutaj potrzebne.
I tę opcję przekażemy w to miejsce. Powinno nam to zadziałać.
Przekonujemy się. Wpiszemy tutaj, w tym katalogu będąc, node index. Serwer się uruchomił i spróbujmy teraz
pod taki adres, jak tutaj napisałem u dołu, przejść, ale z użyciem protokołu https, czyli bezpiecznego.
Zobaczmy. Dokładnie to jest to, o czym mówiłem.
Skoro jest to darmowy certyfikat, który wygenerowaliśmy, nie jest podpisany przez żaden certyficat authority,
więc przeglądarka go nie zna i wyświetla ostrzeżenie.
Ale jeżeli przejdziemy do advanced, to możemy wybrać tutaj, że mimo wszystko chcemy przejść.
No i udało się.
Cały czas tutaj nie będzie to na zielono, ale wszystkie zasoby, które są serwowane teraz do przeglądarki,
są szyfrowane. A gdybyśmy my z przeglądarki jakieś dane wysyłali do serwera, to również one będą zaszyfrowane
poprzez ssl.
Jak zatem widzisz, gdybyś tworzył swój własny serwer i chciałbyś, aby korzystał on z https, to prawdopodobnie
wykupisz sobie certyfikat i pliki tego certyfikatu odpowiednio tutaj również podepniesz. Będziesz mógł to
zrobić z takimi modułami jak Express, z których będziemy korzystać później.