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.
Tą lekcją rozpoczynamy rozdział, w którym poznasz framework Express.js - genialny framework, jeden z najpopularniejszych
modułów dostępnych dla Node.js, napisanych nie przez twórców Node.js
Po tym, jak pokazałem ci, jak tworzyć serwery HTTP i jaki mamy niski poziom tam dostępu, ale też jak trudno
jest obsłużyć np. zapytania pod różne routy, czyli np. /o nas itd,
jak trudno jest serwować statyczne pliki, docenisz na pewno to, co daje ci Express i jak możesz być spokojny,
że to wszystko jest napisane w sposób poprawny i zawsze będzie dobrze działać. Zainstalujemy sobie teraz
Express i pokażę ci, jak z niego korzystać.
Jestem w katalogu 27, w którym mamy na razie tylko jeden plik - index.js.
Będziemy potrzebowali pliku package.json, więc wpisujemy npm init i będziemy tutaj ładować Enterem do samego
końca i zapiszemy. Już nam się pojawił plik package.json, więc możemy zainstalować lokalnie Express. Wpiszę npm
install express.
save. Zostanie Express pobrany, wszystkie jego zależności, z których korzysta.
Nie ma to dla nas znaczenia. Ważne, żeby Express się pojawił.
No i teraz przejdziemy do edytora Sublime Text i będziemy chcieli Express sobie zaimportować. Wpiszemy
const express = require("express").
I to zwróci nam pewną funkcję, która pozwoli nam utworzyć aplikację.
Dlatego stworzę kolejną stałą app i wywołam express.
Teraz pod app będziemy mieli aplikacje. Czyli mógłbyś pomyśleć, że od razu tutaj można było wpisać app i
to wywołać. Jak najbardziej, ale w lekcjach kolejnych będziemy potrzebowali odwołania do samego express
tutaj.
Dlatego sobie to w ten sposób zostawię i wywołuję w tym miejscu, żebym tutaj mógł z samego express skorzystać. I teraz
być może pamiętasz, jak tworzyliśmy sobie serwery za pomocą http.createServer. Express oczywiście korzysta
z http, ale dodaje nam do tego masę funkcjonalności i ułatwień, z których chcemy korzystać.
Dlatego nie będziemy nigdzie tutaj bezpośrednio pisać http.createServer, ale odwołamy się do app i będziemy
chcieli stworzyć sobie swoją pierwszą ścieżkę takiego routingu. Napiszę app.get.
Zaraz ci powiem dlaczego. I tutaj podajemy adres, pod jaki chcemy wykonać tę funkcję, czyli strona główna i
następnie funkcja taka sama jak w przypadku createServer, request i response. Dokładnie
tak samo to wygląda tutaj.
I co jest ważne, to na request czy response będziemy mieli te same metody, które mieliśmy oryginalnie na tym
http-owym module, który importowaliśmy.
Czyli są to streamy. Możemy tutaj wpisać np. write jeżeli chodzi o response -
res.write itd.
Ale oprócz tego te dwa obiekty req oraz res mają bardzo wiele ciekawych metod, które oferuje
nam Express.
Dlatego na stronie Express przejdźmy sobie do API reference, tutaj 4x i mamy taką stronę z dokumentacją, która zapewniam
cię, jest naprawdę świetnie napisana i nie jest zbyt długa.
Opisuje ona cały Express, dlatego polecam ci, abyś po przerobieniu tego rozdziału albo przerobioniu tego kursu,
jeżeli chcesz dobrze nauczyć się Expressa, po prostu tę dokumentację przeczytał, bo zajmie ci to być może
pół godziny.
Przechodząc jednak do request i response, mamy te obiekty tutaj - request i response.
Ta sama funkcja będzie wykonywana oczywiście dla każdego nowego połączenia tak samo jak wcześniej i
te dwa obiekty znajdziesz tutaj.
Jeżeli wpiszesz czy klikniesz request, to możesz tutaj zobaczyć pod req, co się znajduje
razem z przykładami,
czyli co tutaj jest więcej niż było w przypadku standardowego modułu HTTP.
I podobnie jeżeli chodzi o response. Możesz zobaczyć, jakie tutaj mamy stałe, jakie mamy właściwości i jakie
mamy
przede wszystkim metody. Natomiast ja będę chciał ci teraz pokazać, w jaki sposób możemy coś odesłać do
klienta.
Pamiętasz zapewne, że w przypadku serwera HTTP, który pisaliśmy ręcznie w Node.js, korzystaliśmy z response.write
albo z response.end.
Musieliśmy to później zakończyć. Tutaj mamy metodę response.send i możemy wpisać np. tekst. Tu można podać
również buffer, ale podamy sobie tekst Hello World!
W ten sposób.
I co jest ciekawe, to Express zadba o wiele rzeczy, m.in. o poprawne nagłówki.
Taki serwer jednak trzeba najpierw uruchomić.
I to już robimy bardzo podobnie jak w przypadku serwera HTTP - app.listen, podajemy port. Podamy sobie 8080 i funkcja
callback, która się wykona, kiedy serwer się zainicjalizuje,
kiedy się można powiedzieć postawi.
Nie jest ona konieczna, ale wpiszę ją teraz.
Ta informacja nam się pojawi w konsoli.
No więc teraz spróbujmy sobie wywołać nodem albo może nodemonem, którego już ci pokazywałem w tym kursie,
bo on nam będzie wszystko restartował,
plik index. W ten sposób. Pojawił nam się komunikat, więc wszystko jest ok. I spróbujmy teraz przejść pod
localhost 8080.
Mamy Hello World!
Pamiętasz być może, że w przypadku zwykłego serwera mogliśmy tutaj dopisać np. css/style.css no i nic
nie zostało do nas zwrócone, ale normalnie się nam to wszystko obsłużyło.
I tutaj w naszym kodzie pod request.url mogliśmy to zobaczyć.
Natomiast zauważ, co robi Express. Express wyświetli nam informację cannot get.
I tutaj mamy taką ścieżkę.
To oznacza tylko tyle, że skoro nigdzie tutaj nie przypisaliśmy adresu, pod jaki chcemy wykonać daną funkcję,
to nigdzie nie będzie można przejść pod taki adres.
I tutaj się tego nie da zrobić.
A gdybyśmy sobie przeszli do panelu Network, odświeżę, to zauważ, że Express zadbał o to, aby zwrócić 404, czyli
między innymi odpowiedni status code.
No bo skoro nie istnieje taka ścieżka, to chcemy ją w ten sposób zwracać.
Jest to rzecz genialna, natomiast jeżeli przejdziemy pod adres, który zdefiniowaliśmy, to zostanie zwrócony
normalnie - 200, status ok.
Jeżeli tutaj przejdziemy i następnie do Headers, to możemy zobaczyć, że odpowiednie również nagłówki zostały ustawione,
m.in. content type, text/HTML,
czyli to, co ja pokazywałem ci, że musieliśmy robić ręcznie.
Dodatkowo Express dodał jeszcze swój tag x-powered by Express, który jeżeli chcemy, to możemy usunąć.
Jest to taki oto customowy nagłówek, który dla przeglądarki nic nie znaczy.
Jeżeli byśmy go chcieli usunąć, to możemy skorzystać z response, następnie removeHeader i musimy go podać -
x-powered-by.
Teraz jeżeli zapiszę, nodemon nam to zresetuje. Odświeżmy sobie.
Zobaczmy. Powinien zniknąć.
Jak widzisz, nie ma go. To nie jest istotne, ale chciałem ci pokazać, że można to zrobić.
Natomiast mamy jeszcze jedną ciekawą rzecz. Otóż możemy aplikację konfigurować i mamy coś takiego jak
app.enable i app.disable. Więc wpiszemy sobie disable i tutaj możemy podać, co chcemy wyłączyć. I co jest ciekawe, to jeżeli na stronie Express
byśmy sobie wyszukali powered by, to znajdziemy to w tym miejscu.
A jest to tabela z wszystkimi rzeczami, które można wyłączać.
Czyli mogę wpisać symbol app.disable env, etag
i tak dalej.
Równie dobrze mogę wpisać app.disable właśnie x-powered-by.
Jeżeli to podam w tym miejscu, tutaj wykomentowałem, to zostanie to wyłączone.
Możemy odświeżyć raz jeszcze, zobaczyć, że faktycznie tak też się stało.
Nigdzie to tutaj nie jest już podane.
Czyli warto zapoznać się z tym, co możemy włączyć i wyłączyć, bo czasami te opcje będą dla nas przydatne.
Jak zatem widzisz, w ten prosty sposób stworzyliśmy sobie swój prosty, pierwszy serwer z użyciem Express.
Natomiast w kolejnych lekcjach pokażę ci, jak z takiego poziomu możemy przejść
na pisanie już bardziej zaawansowanych aplikacji działających na protokole HTTP.