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 przenosić pliki i katalogi, a także jak zmieniać ich nazwę.
Wszystko to, co ciekawe, jest realizowane za pomocą jednej metody modułu file system, która nazywa się
rename.
Możesz ją znaleźć w dokumentacji - tutaj. Ma ona swoją metodę rename, a także metodę synchroniczną, czyli
renameSync. Już wiesz, jak z takich metod korzystać.
Dlatego teraz będę chciał plik, który znajduje się w katalogu files - plik lorem1.txt - zamienić na plik
lorem2.txt, czyli w zasadzie zmienić wyłącznie jego nazwę.
Treść pozostaje niezmienna.
Zrobimy to asynchronicznie, bo - jak już wiesz - zazwyczaj najlepiej będzie to robić w sposób asynchroniczny,
a więc metoda fs.rename.
I ona przyjmuje trzy parametry. Jako pierwszy podajemy ścieżkę do tego pliku, którego nazwę chcemy zmienić.
Dlatego skorzystamy z naszej funkcji pomocniczej i napiszę tutaj lorem1.txt.
Teraz muszę podać pełną ścieżkę, do jakiej chcę zmienić ten plik.
Czyli znowu pełna ścieżka zostanie nam zwrócona poprzez funkcję file.
Napiszę tutaj lorem2.txt, czyli chcę zmienić nazwę z 1 na 2 i jako trzeci parametr funkcja callback,
która przyjmuje błąd,
jeżeli nie udało się takiej operacji wykonać. Jeżeli się uda, to pod nim będzie wartość null.
Zatem standardowo obsłużmy sobie ten błąd.
Robimy to dokładnie tak samo jak wcześniej.
Jeżeli wszystko pójdzie ok, to ten console.log się wykona. Zobaczmy. Wywołam sobie poprzez node index i widzimy
console.log, że nazwa została poprawnie zmieniona. Zobaczmy, czy tak rzeczywiście jest. I widzimy, że tak. Lorem2
tutaj się teraz pojawił. Jest to dokładnie ten sam plik, ale ze zmienioną nazwą.
Jak wiesz, możesz również skorzystać z metody synchronicznej, która zrobi to bez dodatkowej funkcji callback, ale
będziesz musiał wszystko opleść w bloku try catch,
gdyby pojawił się jakiś błąd. W tym przypadku jeżeli będzie błąd, to coś możemy z nim tutaj zrobić, ale
wcale nie musimy.
Gdybyśmy teraz raz jeszcze to wykonali, no to błąd się pojawi z tego powodu, że plik lorem1 nie istnieje.
Więc może sobie to sprawdźmy.
Widzimy - wystąpił błąd i rzeczywiście jego treść została poprawnie tutaj wyświetlona.
Teraz pokażę ci, jak możemy ten plik, który mamy, a więc lorem2.txt przenieść do innego katalogu.
Chciałbym tutaj utworzyć katalog new files i tam przenieść cały ten plik. Dlatego to, co mamy tutaj, sobie skopiuję,
ale również wykomentuję.
Wspomniałem ci, że za pomocą jednej metody można to wszystko zrobić. Dokładnie tak jest.
A więc metoda rename pozwala nam przenosić również pliki do innych katalogów.
Szukamy zatem pliku lorem2, który znajduje się w katalogu files.
Mamy tę metodę, która nam zwróci właśnie odwołanie do files, natomiast do new files musimy sobie tutaj teraz podać
pełną ścieżkę.
Nie mamy do tego metody, ale skorzystamy z path.join. Również już tę metodę znasz i u góry również z niej korzystamy.
Następnie chciałbym, żebyśmy mieli katalog new files i chciałbym, aby nowy plik, który tam przeniesiemy,
nazywał się np. lorem1. Czyli nie tylko chcę go przenieść, ale powiedzmy zmienić jego nazwę na lorem1.
Nie musimy tego robić, ale zróbmy sobie to.
Czyli, jak widzisz, przenoszenie pliku do innego katalogu polega tylko na tym, że musiałem podać ścieżkę
do tego katalogu.
Zobaczmy, jak to będzie wyglądać.
Tutaj sobie jeszcze zmienimy ten console.log.
Ok.
Teraz informacja będzie prawdziwa, jeżeli wszystko będzie w porządku. Wywołajmy to sobie, no i widzimy, że mamy
błąd: no such file or directory.
Oznacza to tylko tyle, że nie możemy przenieść naszego pliku do katalogu new files, bo ten katalog nie istnieje.
Dlatego utwórzmy sobie teraz taki katalog. Ja wpiszę mkdir.
Ok.
I raz jeszcze wpiszemy sobie node index i tym razem wszystko się udało.
Czyli taki katalog nie istniał, to nie mogliśmy do niego przenieść naszego pliku.
Jak sobie zatem z tym poradzić, abyśmy nie musieli tworzyć ręcznie takiego katalogu?
Otóż stworzymy sobie teraz fajną pomocniczą funkcję, przy okazji której zobaczysz kilka ciekawych technik.
I ta funkcja pozwoli nam tworzyć nowy katalog, jeżeli on nie istnieje.
Zapamiętaj sobie, że w tym kursie poznasz jeszcze npm, czyli package managera dla Node, a ten z kolei pozwoli
ci pobrać naprawdę ogromne ilości modułów, które takie operacje jak tutaj robimy, znacznie uproszczą.
Natomiast chciałbym ci teraz pokazać, jak możesz sam sobie uprościć taką operację, a przy okazji czegoś
nowego się nauczysz.
Dlatego będę chciał to, co mamy tutaj, sobie wykomentować i będę chciał stworzyć funkcję.
Więc zacznijmy od tego, że ją wywołamy i dzięki temu będziemy wiedzieć, jak ona ma działać.
Ja ją tutaj wkleję. A więc chciałbym mieć funkcję, która będzie nazywać się moveFileTo, gdzie ja podam
ścieżkę do jakiegoś pliku, podam następnie katalog, do jakiego chcę przenieść ten plik, i ten katalog
będziemy tworzyć, jeżeli nie będzie istniał, i następnie chcę podać sobie funkcję własną, która wywoła
się, kiedy ta operacja się zakończy.
Jeżeli będzie jakiś błąd, to ma być on jako pierwszy parametr podany i zauważ, że w tym przypadku my sami
tworzymy sobie taki moduł można powiedzieć tak naprawdę - w naszym przypadku tylko będzie to funkcja - który
będzie zachowywał się w sposób error-first callback, o czym już ci w tym kursie mówiłem. Czyli jeżeli będzie błąd, to chcę,
aby był on pod pierwszym parametrem.
Jako drugi będziemy mieli ścieżkę do tego nowego pliku i również nazwę katalogu.
Tę informację chcę tutaj przekazać po to, aby móc sobie je wyświetlić, czyli w ten sposób chcę wywoływać naszą
funkcję.
Dlatego teraz sobie taką funkcję stworzymy.
Możemy to zrobić w tym miejscu.
Wiesz już, jak eksportować moduły, dlatego bez problemu
tę funkcję można by było zapisać w zewnętrznym module.
Te parametry, które są tutaj, będziemy chcieli, aby ona kolejno przyjmowała. Czyli pierwszy z nich nazwiemy
sobie filepatch.
Drugi to będzie directory. I trzeci nazwę cb. Cb to callback, czyli będzie to ta właśnie cała funkcja, czyli ta
cała funkcja będzie w naszej funkcji pod parametrem cb.
I teraz od czego będziemy chcieli zacząć?
Mianowicie będę chciał sobie nadpisać zmienną, którą mamy tutaj w filepath, bo zauważ, że pozwoliłem tutaj użytkownikowi
wpisać w taki oto sposób ścieżkę, a wiemy, że w naszym przypadku to poprawnie nie zadziała, bo nie jest
to cała ścieżka. Dlatego będę chciał
to, co znajduje się pod filepath, czyli dokładnie taki string
w tym przypadku, sobie nadpisać. A więc napiszę, że filepath
ma to być i odwołam się do modułu path i następnie do znanej nam już metody join(_ _dirname), i następnie
dopiero filepath. W ten sposób. Ale mamy w path jeszcze jedną ciekawą metodę, która nazywa się normalize.
Więc napiszmy tutaj path.normalize i dopiero wtedy podam filepath.
W ten sposób. Czyli path.normalize weźmie sobie ten string, znormalizuje go - zaraz ci powiem, o co chodzi - i go zwróci.
I dopiero jego będziemy chcieli połączyć poprzez path.join z aktualnym katalogiem i to zapisać sobie pod filepath.
Przejdźmy sobie tutaj na stronę dokumentacji Node, do path i następnie do metody normalize.
I tutaj możesz przeczytać, na czym ta metoda polega.
Generalnie działa ona w ten sposób, że zadba o to, że jeżeli użytkownik by tutaj podał jakąś ścieżkę nie
w stu procentach poprawną, np. z dwoma slashami, to wszystko to zostanie znormalizowane. Albo gdyby sobie podał
tutaj ścieżkę, np. w ten sposób, to ona zostanie poprawnie rozwinięta.
Robię to po to, że jeżeli komuś byśmy udostępnili taką funkcję i on by np. tutaj skorzystał z jakichś innych
metod path, join itd i coś by niepoprawnie podał, to chcę to jeszcze znormalizować.
Nie jest to idealne i nie obsłuży każdego przypadku, ale chciałem ci pokazać, że działa.
Więc gdyby ten moduł był przez nas udostępniany gdzieś dalej, to musielibyśmy jeszcze o wiele różnych
przypadków zadbać.
Niemniej jednak pod filepath w tym miejscu będziemy mieli całą ścieżkę do tego pliku, w tym przypadku lorem2.txt.
Teraz będziemy chcieli utworzyć nowy katalog, który mamy tutaj, czyli new files. Więc najpierw ten, który
mieliśmy wcześniej, będę chciał usunąć. Ale zerknijmy - no właśnie, plik został tam przeniesiony,
czyli może ja files usunę, a new files zmienię nazwę na files.
Ok, w ten sposób. I mamy tutaj plik lorem1, więc może to zamieńmy na lorem1. I teraz będziemy chcieli
właśnie ten plik przenieść do katalogu new files, czyli taki katalog chcę utworzyć.
Wiesz już, jak to zrobić, więc zróbmy to szybko za pomocą mkdir.
Tutaj podaliśmy tylko nazwę katalogu, a potrzebujemy pełnej ścieżki, a więc path.join - to również już doskonale
znasz - dirname i następnie directory.
Mamy to podane tutaj.
No i funkcja callback z błędem, jeżeli jest. I teraz pojawi się tutaj bardzo ważna konstrukcja.
Mianowicie jeżeli wystąpi błąd, to chcę zakończyć tę funkcję i wywołać funkcję callback, przekazując jej
błąd.
Czyli w tym momencie pokazuję ci, jak tworzyć własne moduły, własne funkcje, które jakby podążają za tymi
konwencjami dostępnymi w Node. Mówiłem ci, że mamy error-first callback, no i dlatego tworząc naszą funkcję, również
powiedziałem, że ja bym chciał tutaj podawać własną funkcję, która jako pierwszy parametr przyjmuje błąd.
I zauważ, co staje się tutaj. Jeżeli chcemy utworzyć nowy katalog, ale się to nie uda,
czyli wystąpi błąd, to ja chcę ten błąd przekazać do mojej funkcji. Czyli tak naprawdę ktoś może nie
widzieć w ogóle naszego modułu.
On ma tylko taką funkcję moveFileTo i wie, że jeżeli wystąpi jakiś błąd, to w jego funkcji pojawi się
w tym miejscu.
Właśnie dzięki temu, że ja sobie to tutaj wywołałem i zakończyłem cały ten kod.
Oczywiście możemy jeszcze tutaj przekazać te parametry, gdyby ktoś chciał z nich korzystać, aby nie miały
wartości undefined. Więc mamy tutaj filepath czy directory, więc przekażemy to.
Wiemy zatem, że jeżeli pojawi się błąd, to wykona się nasza funkcja i dostanie tutaj błąd.
A to oznacza tylko tyle, że z kolei to, co mamy w tym miejscu, również ją wykona i będziemy widzieli błąd
przekazany w tym miejscu.
Ale jedna rzecz jest ciekawa. Otóż chciałbym ten plik przenieść do katalogu new files i go utworzyć.
Ale jeżeli ten katalog już istnieje, to będziemy mieli błąd.
Pamiętasz z tego
mkdir, bo już ci to wcześniej pokazywałem.
Nie byłoby to zbyt intuicyjne, bo ja za pomocą moveFileTo chcę przenieść plik do tego katalogu, więc głupio
byłoby, gdyby zakładając, że ten katalog istnieje,
gdybym nie mógł tego pliku tam przenieść, bo wykonywałby nam się cały czas błąd. Czyli chciałbym sprawdzić sobie
tutaj jeszcze, czy błąd jest spowodowany tym, że katalog istnieje, czy nie.
Czyli jeżeli wystąpi błąd, to chciałbym do niego dopisać coś takiego.
Czyli jeżeli jest błąd i kod tego błędu, również ci to w tym kursie już pokazywałem,
nie jest równy
takiej właśnie wartości,
to tylko wtedy chcę zakończyć i wywołać funkcję callback.
Dlatego że jeżeli katalog już istnieje,
gdyby tutaj new files istniało, to będziemy mieli błąd i jego code będzie równy czemuś takiemu.
Więc ja tutaj sprawdzam, czy nie jest równy. Jeżeli nie jest równy, to wtedy chcę zakończyć. A jeżeli jest
równy, czyli katalog już istniał, to to się nie wywoła i przejdziemy dalej.
Jeśli zatem katalog nie istnieje, będzie utworzony. Jeżeli istnieje, tak czy siak pojawi mi się w tym miejscu
I teraz nie pozostaje nam nic innego, jak mając już ten katalog utworzony, przenieść plik lorem1.txt
do tego właśnie katalogu. Wiesz, że przenosimy za pomocą funkcji rename, więc odwołamy się do rename.
Chcemy przenieść plik podany tutaj, ale my sobie go już znormalizowaliśmy. Mamy to pod filepath.
Więc filepath podaję i następnie chcę go przenieść do tego nowego katalogu.
Jak możemy to zrobić?
Otóż zauważ, że tutaj mamy new files, a tutaj mieliśmy podane całe files z tym.
Czyli muszę mieć nazwę tego pliku, a więc takiego stringu, jak jest tutaj.
Czy w zasadzie z pełnej ścieżki jaką mamy pod filepath, możemy sobie odczytać samą nazwę tego pliku za pomocą modułu
path i jego metody basename. Również ci to już pokazywałem.
I to wszystko będziemy chcieli połączyć z nazwą nowego katalogu.
Więc najpierw path.join, dirname, następnie directory, czyli new files.
I do tego chcę dodać nazwę tego pliku przenoszonego, czyli właśnie samo to lorem1.txt.
I w tym miejscu posłużymy się path.basename i przekażę filepath. Z tego basename zostanie zwrócony właśnie
lorem1.txt,
a path.join ładnie nam to wszystko połączy.
Czyli ten plik zostanie przeniesiony poprawnie właśnie do tego katalogu. Na końcu funkcja callback z
błędem, jeżeli był.
I ponownie - jeżeli był jakiś błąd, czyli if(err), to chcemy zakończyć, wywołując naszą funkcję callback, którą cały
czas mamy tutaj pod tym parametrem cb.
Czyli znowu cb z błędem, no i podajmy sobie tutaj również filepath i directory, aby w tej funkcji było to dostępne.
Natomiast jeżeli nie wystąpi błąd, a to oznacza, że poprawnie ten plik został przeniesiony do nowo utworzonego
katalogu, to również chcemy wykonać funkcję callback, którą mamy tutaj. Czyli ta funkcja musi się wykonać,
ale nie chcemy, aby tutaj był błąd.
A to oznacza, że wykonamy cb. Jako pierwszy parametr podamy null.
Dzięki temu na przykład ten warunek się nie wykona, a jako drugi znowu filepath i directory.
Mam nadzieję, że jest dla ciebie jasne, bo nie jest to jakoś skomplikowany przykład.
Teraz już jest gotowy.
Czyli powiedzmy, że to, co mamy tutaj, wyeksportowalibyśmy jako moduł i komuś dajemy tylko taką funkcję, gdzie
mówimy: Podaj ścieżkę do pliku, który chcesz przenieść.
Podaj nazwę katalogu, do którego chcesz przenieść - utworzymy go, jeżeli go nie ma. Jeżeli jest, to też nie
ma problemu.
Następnie podaj swoją funkcję, którą chcesz wywołać, kiedy to wszystko się zakończy.
Jeżeli będzie błąd, to podamy ci go jako pierwszy parametr. Jeżeli nie, to będziesz miał tutaj wartość null.
Teraz sobie sprawdźmy.
Widzimy, że new files nie istnieje. Wpiszę node index i widzimy - przeniesiono plik,
jaki to był plik, do jakiego katalogu. I zauważ, że ten console.log nie jest z naszego modułu, czyli z tej funkcji,
ale właśnie z wywołania użytkownika, czyli z jego funkcji,
z tego oto miejsca. Widzimy, że katalog new files się pojawił, plik lorem jest w środku, a nie ma go już w
katalogu files.
W ten prosty sposób utworzyliśmy sobie własną funkcję, którą możemy wyeksportować jako moduł.
I ta właśnie funkcja pozwoli nam przenosić pliki do innych katalogów.
Ona oczywiście aby była w stu procentach nadająca się do udostępniania w internecie i aby była bardziej
profesjonalna, musiałaby zadbać jeszcze o wiele innych przypadków, np. o bardziej poprawne podawanie tej
ścieżki, czy o lepszą jej normalizację.
Natomiast na nasz przykład, jak widzisz, działa. W tej lekcji zobaczyłeś zatem metodę rename, która pozwala
nam zmieniać nazwy plików, a także przenosić ich do innych katalogów, a także stworzyliśmy sobie taką
funkcję, która w bardzo łatwy sposób pozwoli nam to zrobić. I poznałeś techniki takie jak np. error-first callback
i w jaki sposób funkcję użytkownika, czyli taką jak tutaj, odpowiednio w wielu miejscach naszego modułu
obsłużyć, aby przyjmowała błąd
tam, gdzie jest to konieczne i aby wywoływała się bez błędu tam, gdzie wszystko pójdzie po naszej myśli.