podręcznik node.js. smashing magazine
Post on 11-Jan-2017
231 Views
Preview:
TRANSCRIPT
Tytuł oryginału Smashing Nodejs JavaScript Everywhere
Tłumaczenie Krzysztof Wołowski
ISBN 978-83-246-6674-4
This edition first published 2012copy 2012 Guillermo Rauch
All Rights Reserved Authorised translation from the English language edition published by John Wiley amp Sons Limited Responsibility for the accuracy of the translation rests solely with Helion SA and is not the responsibility of John Wiley amp Sons Limited
No part of this book may be reproduced in any form without the written permission of the original copyright holder John Wiley amp Sons Limited
Translation copyright copy 2014 by Helion SA
Wiley and the John Wiley amp Sons Ltd logo are trademarks or registered trademarks of John Wiley amp Sons Inc andor its affiliates in the United States andor other countries and may not be used without written permission All other trademarks are the property of their respective owners John Wiley amp Sons Ltd is not associated with any product or vendor mentioned in the book
Wszelkie prawa zastrzeżone Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione Wykonywanie kopii metodą kserograficzną fotograficzną a także kopiowanie książki na nośniku filmowym magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli
Wydawnictwo HELION dołożyło wszelkich starań by zawarte w tej książce informacje były kompletnei rzetelne Nie bierze jednak żadnej odpowiedzialności ani za ich wykorzystanie ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich Wydawnictwo HELION nie ponosi roacutewnież żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce
Wydawnictwo HELIONul Kościuszki 1c 44-100 GLIWICEtel 32 231 22 19 32 230 98 63e-mail helionhelionplWWW httphelionpl (księgarnia internetowa katalog książek)
Pliki z przykładami omawianymi w książce można znaleźć pod adresem ftpftphelionplprzykladypodnodzip
Drogi CzytelnikuJeżeli chcesz ocenić tę książkę zajrzyj pod adres httphelionpluseropiniepodnodMożesz tam wpisać swoje uwagi spostrzeżenia recenzję
Printed in Poland
bull Kup książkębull Poleć książkę bull Oceń książkę
bull Księgarnia internetowabull Lubię to raquo Nasza społeczność
Spis treści
Część I Szybki start instalacja i pojęcia ogoacutelne 19
Rozdział 1 Przygotowanie środowiska 21Instalacja w systemie Windows 22Instalacja w systemie OS X 22Instalacja w systemie Linux 23
Kompilacja 23Kontrola działania 23
Narzędzie REPL Node 23Wykonanie skryptu 24NPM 25
Instalowanie modułoacutew 25Definiowanie własnego modułu 26Instalacja narzędzi binarnych 27Przeszukiwanie rejestru NPM 28
Podsumowanie 29
Rozdział 2 Przegląd JavaScript 31Podstawowy JavaScript 32
Typy 32Typowa łamigłoacutewka 32Funkcje 33Konstrukcje this call() i apply() 34Arność funkcji 34Domknięcia 35Klasy 35Dziedziczenie 36Blok try catch 37
JavaScript w wersji v8 38Metoda keys() obiektu 38Metoda isArray() tablicy 39Metody tablic 39Metody łańcuchoacutew znakoacutew 39JSON 39Metoda bind() funkcji 40Właściwość name funkcji 40Właściwość __proto__ i dziedziczenie 40Metody dostępowe 41
Podsumowanie 42
Kup książkę Poleć książkę
SPIS TREŚCI
6
Rozdział 3 Blokujące i nieblokujące operacje wejścia-wyjścia 43Duże możliwości to duża odpowiedzialność 44
Blokowanie 46Jednowątkowy świat 47Obsługa błędoacutew 50Ślady stosoacutew wywołań 51
Podsumowanie 53
Rozdział 4 JavaScript dla Node 55Obiekt globalny 56
Pożyteczne zmienne globalne 56System modułoacutew 57
Moduły względne i bezwzględne 57Udostępnianie interfejsu programistycznego 59Zdarzenia 61Bufory 63Podsumowanie 64
Część II Najistotniejsze interfejsy programistyczne Node 65
Rozdział 5 Wiersz poleceń i moduł FS Twoja pierwsza aplikacja 67Wymagania 68Piszemy nasz pierwszy program 68
Tworzymy moduł 69sync czy async 70Zrozumienie strumieni 71Wejście i wyjście 73Refaktoring 75Interakcja z modułem fs 77
Wiersz poleceń 79Obiekt argv 79Katalog roboczy 80Zmienne środowiskowe 81Zakańczanie programu 81Sygnały 82Sekwencje sterujące ANSI 82
Moduł fs 82Strumienie 83Obserwacja 84
Podsumowanie 84
Rozdział 6 Protokoacuteł TCP 87Czym charakteryzuje się TCP 88
Komunikacja z naciskiem na połączenia i zasada zachowania kolejności 88Kod bajtowy jako podstawowa reprezentacja 88Niezawodność 89Kontrola przepływu 89Kontrola przeciążeń 89
Kup książkę Poleć książkę
SPIS TREŚCI
7
Telnet 89Czat na bazie TCP 92
Tworzymy moduł 92Klasa netServer 92Odbieranie połączeń 94Zdarzenie data 96Stan i monitorowanie połączeń 97Wykończenie 100
Klient IRC 102Tworzymy moduł 102Interfejs netStream 103Implementacja części protokołu IRC 103Test z prawdziwym serwerem IRC 104
Podsumowanie 104
Rozdział 7 Protokoacuteł HTTP 105Struktura HTTP 106Nagłoacutewki 107Połączenia 111Prosty serwer WWW 112
Tworzymy moduł 112Wyświetlamy formularz 112Metody i adresy URL 114Dane 117Składamy elementy w całość 119Dopracowanie szczegoacutełoacutew 120
Klient Twittera 121Tworzymy moduł 121Wysyłanie prostego żądania HTTP 122Wysłanie danych 123Pobieranie tweetoacutew 124
Moduł superagent na pomoc 128Przeładowanie serwera za pomocą narzędzia up 130Podsumowanie 130
Część III Tworzenie aplikacji sieciowych 133
Rozdział 8 Framework Connect 135Prosta strona internetowa przy użyciu modułu http 136Prosta strona internetowa przy użyciu frameworka Connect 139Metody pośredniczące 141
Tworzenie metod pośredniczących wielokrotnego użytku 142Metoda pośrednicząca static 146Metoda pośrednicząca query 148Metoda pośrednicząca logger 148Metoda pośrednicząca bodyParser 150Ciasteczka 153Metoda pośrednicząca session 154
Kup książkę Poleć książkę
SPIS TREŚCI
8
Sesje Redis 159Metoda pośrednicząca methodOverride 160Metoda pośrednicząca basicAuth 160
Podsumowanie 162
Rozdział 9 Framework Express 163Prosta aplikacja Express 164
Tworzymy moduł 164HTML 164Konfiguracja 165Definiowanie tras 166Moduł search 168Uruchomienie aplikacji 169
Ustawienia 170Mechanizmy szablonoacutew 172Obsługa błędoacutew 173Metody złożone 173Trasy 175Metody pośredniczące 177Strategie organizacji 178Podsumowanie 180
Rozdział 10 Technologia WebSocket 181AJAX 182Technologia WebSocket 184Aplikacja Echo 185
Przygotowanie 185Konfiguracja serwera 186Konfiguracja klienta 187Uruchomienie serwera 188
Kursory myszy 189Przygotowanie 189Konfiguracja serwera 189Konfiguracja klienta 192Uruchomienie serwera 194
Kwestie do rozwiązania 194Zamknięcie połączenia a rozłączenie 195JSON 195Ponowne łączenie 195Rozgłaszanie 195WebSocket to HTML5 starsze przeglądarki go nie obsługują 195Rozwiązanie 195
Podsumowanie 196
Rozdział 11 Framework SocketIO 197Transporty 198
Rozłączenie kontra zamknięcie połączenia 198Zdarzenia 198Przestrzenie nazw 199
Kup książkę Poleć książkę
SPIS TREŚCI
9
Czat 200Przygotowanie programu 200Konfiguracja serwera 200Konfiguracja klienta 201Zdarzenia i rozgłaszanie 203Gwarancja odbioru 207
Aplikacja DJ 209Rozszerzenie czata 209Integracja z interfejsem Grooveshark 210Odtwarzanie 213
Podsumowanie 218
Część IV Bazy danych 219
Rozdział 12 MongoDB 221Instalacja 223Dostęp do MongoDB przykład uwierzytelnienia użytkownika 224
Konfiguracja aplikacji 224Tworzymy aplikację Express 224Łączymy się z MongoDB 228Tworzymy dokumenty 230Wyszukiwanie dokumentoacutew 232Metoda pośrednicząca do uwierzytelniania 233Sprawdzanie poprawności danych 234Niepodzielność 235Tryb bezpieczny 235
Wprowadzenie do Mongoose 236Definiowanie modelu 236Definiowanie zagnieżdżonych kluczy 238Definiowanie zagnieżdżonych dokumentoacutew 238Ustawianie indeksoacutew 239Metody pośredniczące 239Sprawdzanie stanu modelu 239Zapytania 240Rozszerzanie zapytań 240Sortowanie 240Wybieranie danych 240Limitowanie wynikoacutew 241Pomijanie wynikoacutew 241Automatyczne wypełnianie kluczy 241Konwersja typoacutew 242
Przykład Mongoose 242Konfiguracja aplikacji 242Refaktoryzacja 243Definiowanie modeli 243
Podsumowanie 245
Kup książkę Poleć książkę
SPIS TREŚCI
10
Rozdział 13 MySQL 247node-mysql 248
Konfiguracja 248Aplikacja Express 248Łączenie z MySQL 249Inicjalizacja skryptu 250Wstawianie danych 253Pobieranie danych 258
Narzędzie Sequelize 259Konfiguracja Sequelize 260Konfiguracja aplikacji Express 260Konfiguracja Sequelize 263Definiowanie modeli i synchronizacja 264Wstawianie danych 266Pobieranie danych 268Usuwanie danych 269Wykończenie 271
Podsumowanie 272
Rozdział 14 Redis 273Instalacja Redis 275Język zapytań Redis 275Typy danych 276
Ciągi znakoacutew 277Tablice asocjacyjne 277Listy 279Zbiory 279Zbiory sortowane 280
Redis i Node 280Implementacja mapy relacji przy użyciu Node i Redis 281
Podsumowanie 290
Część V Testowanie 291
Rozdział 15 Wspoacutełdzielony kod 293Co może być wspoacutełdzielone 294Kompatybilność kodu JavaScript 294
Udostępnianie modułoacutew 295Adaptacja interfejsoacutew programistycznych ECMA 296Adaptacja interfejsoacutew programistycznych Node 297Adaptacja interfejsoacutew programistycznych przeglądarek 298Dziedziczenie dla wszystkich przeglądarek 298
Zastosowanie praktyczne narzędzie browserbuild 299Prosty przykład 300
Podsumowanie 302
Kup książkę Poleć książkę
SPIS TREŚCI
11
Rozdział 16 Testowanie 305Proste testy 306
Przedmiot testoacutew 306Strategia testoacutew 306Program testowy 307
Expectjs 308Przegląd interfejsoacutew programistycznych 308
Mocha 310Testowanie asynchronicznego kodu 311Styl BDD 313Styl TDD 314Styl eksportu 314Korzystanie z Mocha w przeglądarce 315
Podsumowanie 316
Skorowidz 317
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
Spis treści
Część I Szybki start instalacja i pojęcia ogoacutelne 19
Rozdział 1 Przygotowanie środowiska 21Instalacja w systemie Windows 22Instalacja w systemie OS X 22Instalacja w systemie Linux 23
Kompilacja 23Kontrola działania 23
Narzędzie REPL Node 23Wykonanie skryptu 24NPM 25
Instalowanie modułoacutew 25Definiowanie własnego modułu 26Instalacja narzędzi binarnych 27Przeszukiwanie rejestru NPM 28
Podsumowanie 29
Rozdział 2 Przegląd JavaScript 31Podstawowy JavaScript 32
Typy 32Typowa łamigłoacutewka 32Funkcje 33Konstrukcje this call() i apply() 34Arność funkcji 34Domknięcia 35Klasy 35Dziedziczenie 36Blok try catch 37
JavaScript w wersji v8 38Metoda keys() obiektu 38Metoda isArray() tablicy 39Metody tablic 39Metody łańcuchoacutew znakoacutew 39JSON 39Metoda bind() funkcji 40Właściwość name funkcji 40Właściwość __proto__ i dziedziczenie 40Metody dostępowe 41
Podsumowanie 42
Kup książkę Poleć książkę
SPIS TREŚCI
6
Rozdział 3 Blokujące i nieblokujące operacje wejścia-wyjścia 43Duże możliwości to duża odpowiedzialność 44
Blokowanie 46Jednowątkowy świat 47Obsługa błędoacutew 50Ślady stosoacutew wywołań 51
Podsumowanie 53
Rozdział 4 JavaScript dla Node 55Obiekt globalny 56
Pożyteczne zmienne globalne 56System modułoacutew 57
Moduły względne i bezwzględne 57Udostępnianie interfejsu programistycznego 59Zdarzenia 61Bufory 63Podsumowanie 64
Część II Najistotniejsze interfejsy programistyczne Node 65
Rozdział 5 Wiersz poleceń i moduł FS Twoja pierwsza aplikacja 67Wymagania 68Piszemy nasz pierwszy program 68
Tworzymy moduł 69sync czy async 70Zrozumienie strumieni 71Wejście i wyjście 73Refaktoring 75Interakcja z modułem fs 77
Wiersz poleceń 79Obiekt argv 79Katalog roboczy 80Zmienne środowiskowe 81Zakańczanie programu 81Sygnały 82Sekwencje sterujące ANSI 82
Moduł fs 82Strumienie 83Obserwacja 84
Podsumowanie 84
Rozdział 6 Protokoacuteł TCP 87Czym charakteryzuje się TCP 88
Komunikacja z naciskiem na połączenia i zasada zachowania kolejności 88Kod bajtowy jako podstawowa reprezentacja 88Niezawodność 89Kontrola przepływu 89Kontrola przeciążeń 89
Kup książkę Poleć książkę
SPIS TREŚCI
7
Telnet 89Czat na bazie TCP 92
Tworzymy moduł 92Klasa netServer 92Odbieranie połączeń 94Zdarzenie data 96Stan i monitorowanie połączeń 97Wykończenie 100
Klient IRC 102Tworzymy moduł 102Interfejs netStream 103Implementacja części protokołu IRC 103Test z prawdziwym serwerem IRC 104
Podsumowanie 104
Rozdział 7 Protokoacuteł HTTP 105Struktura HTTP 106Nagłoacutewki 107Połączenia 111Prosty serwer WWW 112
Tworzymy moduł 112Wyświetlamy formularz 112Metody i adresy URL 114Dane 117Składamy elementy w całość 119Dopracowanie szczegoacutełoacutew 120
Klient Twittera 121Tworzymy moduł 121Wysyłanie prostego żądania HTTP 122Wysłanie danych 123Pobieranie tweetoacutew 124
Moduł superagent na pomoc 128Przeładowanie serwera za pomocą narzędzia up 130Podsumowanie 130
Część III Tworzenie aplikacji sieciowych 133
Rozdział 8 Framework Connect 135Prosta strona internetowa przy użyciu modułu http 136Prosta strona internetowa przy użyciu frameworka Connect 139Metody pośredniczące 141
Tworzenie metod pośredniczących wielokrotnego użytku 142Metoda pośrednicząca static 146Metoda pośrednicząca query 148Metoda pośrednicząca logger 148Metoda pośrednicząca bodyParser 150Ciasteczka 153Metoda pośrednicząca session 154
Kup książkę Poleć książkę
SPIS TREŚCI
8
Sesje Redis 159Metoda pośrednicząca methodOverride 160Metoda pośrednicząca basicAuth 160
Podsumowanie 162
Rozdział 9 Framework Express 163Prosta aplikacja Express 164
Tworzymy moduł 164HTML 164Konfiguracja 165Definiowanie tras 166Moduł search 168Uruchomienie aplikacji 169
Ustawienia 170Mechanizmy szablonoacutew 172Obsługa błędoacutew 173Metody złożone 173Trasy 175Metody pośredniczące 177Strategie organizacji 178Podsumowanie 180
Rozdział 10 Technologia WebSocket 181AJAX 182Technologia WebSocket 184Aplikacja Echo 185
Przygotowanie 185Konfiguracja serwera 186Konfiguracja klienta 187Uruchomienie serwera 188
Kursory myszy 189Przygotowanie 189Konfiguracja serwera 189Konfiguracja klienta 192Uruchomienie serwera 194
Kwestie do rozwiązania 194Zamknięcie połączenia a rozłączenie 195JSON 195Ponowne łączenie 195Rozgłaszanie 195WebSocket to HTML5 starsze przeglądarki go nie obsługują 195Rozwiązanie 195
Podsumowanie 196
Rozdział 11 Framework SocketIO 197Transporty 198
Rozłączenie kontra zamknięcie połączenia 198Zdarzenia 198Przestrzenie nazw 199
Kup książkę Poleć książkę
SPIS TREŚCI
9
Czat 200Przygotowanie programu 200Konfiguracja serwera 200Konfiguracja klienta 201Zdarzenia i rozgłaszanie 203Gwarancja odbioru 207
Aplikacja DJ 209Rozszerzenie czata 209Integracja z interfejsem Grooveshark 210Odtwarzanie 213
Podsumowanie 218
Część IV Bazy danych 219
Rozdział 12 MongoDB 221Instalacja 223Dostęp do MongoDB przykład uwierzytelnienia użytkownika 224
Konfiguracja aplikacji 224Tworzymy aplikację Express 224Łączymy się z MongoDB 228Tworzymy dokumenty 230Wyszukiwanie dokumentoacutew 232Metoda pośrednicząca do uwierzytelniania 233Sprawdzanie poprawności danych 234Niepodzielność 235Tryb bezpieczny 235
Wprowadzenie do Mongoose 236Definiowanie modelu 236Definiowanie zagnieżdżonych kluczy 238Definiowanie zagnieżdżonych dokumentoacutew 238Ustawianie indeksoacutew 239Metody pośredniczące 239Sprawdzanie stanu modelu 239Zapytania 240Rozszerzanie zapytań 240Sortowanie 240Wybieranie danych 240Limitowanie wynikoacutew 241Pomijanie wynikoacutew 241Automatyczne wypełnianie kluczy 241Konwersja typoacutew 242
Przykład Mongoose 242Konfiguracja aplikacji 242Refaktoryzacja 243Definiowanie modeli 243
Podsumowanie 245
Kup książkę Poleć książkę
SPIS TREŚCI
10
Rozdział 13 MySQL 247node-mysql 248
Konfiguracja 248Aplikacja Express 248Łączenie z MySQL 249Inicjalizacja skryptu 250Wstawianie danych 253Pobieranie danych 258
Narzędzie Sequelize 259Konfiguracja Sequelize 260Konfiguracja aplikacji Express 260Konfiguracja Sequelize 263Definiowanie modeli i synchronizacja 264Wstawianie danych 266Pobieranie danych 268Usuwanie danych 269Wykończenie 271
Podsumowanie 272
Rozdział 14 Redis 273Instalacja Redis 275Język zapytań Redis 275Typy danych 276
Ciągi znakoacutew 277Tablice asocjacyjne 277Listy 279Zbiory 279Zbiory sortowane 280
Redis i Node 280Implementacja mapy relacji przy użyciu Node i Redis 281
Podsumowanie 290
Część V Testowanie 291
Rozdział 15 Wspoacutełdzielony kod 293Co może być wspoacutełdzielone 294Kompatybilność kodu JavaScript 294
Udostępnianie modułoacutew 295Adaptacja interfejsoacutew programistycznych ECMA 296Adaptacja interfejsoacutew programistycznych Node 297Adaptacja interfejsoacutew programistycznych przeglądarek 298Dziedziczenie dla wszystkich przeglądarek 298
Zastosowanie praktyczne narzędzie browserbuild 299Prosty przykład 300
Podsumowanie 302
Kup książkę Poleć książkę
SPIS TREŚCI
11
Rozdział 16 Testowanie 305Proste testy 306
Przedmiot testoacutew 306Strategia testoacutew 306Program testowy 307
Expectjs 308Przegląd interfejsoacutew programistycznych 308
Mocha 310Testowanie asynchronicznego kodu 311Styl BDD 313Styl TDD 314Styl eksportu 314Korzystanie z Mocha w przeglądarce 315
Podsumowanie 316
Skorowidz 317
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SPIS TREŚCI
6
Rozdział 3 Blokujące i nieblokujące operacje wejścia-wyjścia 43Duże możliwości to duża odpowiedzialność 44
Blokowanie 46Jednowątkowy świat 47Obsługa błędoacutew 50Ślady stosoacutew wywołań 51
Podsumowanie 53
Rozdział 4 JavaScript dla Node 55Obiekt globalny 56
Pożyteczne zmienne globalne 56System modułoacutew 57
Moduły względne i bezwzględne 57Udostępnianie interfejsu programistycznego 59Zdarzenia 61Bufory 63Podsumowanie 64
Część II Najistotniejsze interfejsy programistyczne Node 65
Rozdział 5 Wiersz poleceń i moduł FS Twoja pierwsza aplikacja 67Wymagania 68Piszemy nasz pierwszy program 68
Tworzymy moduł 69sync czy async 70Zrozumienie strumieni 71Wejście i wyjście 73Refaktoring 75Interakcja z modułem fs 77
Wiersz poleceń 79Obiekt argv 79Katalog roboczy 80Zmienne środowiskowe 81Zakańczanie programu 81Sygnały 82Sekwencje sterujące ANSI 82
Moduł fs 82Strumienie 83Obserwacja 84
Podsumowanie 84
Rozdział 6 Protokoacuteł TCP 87Czym charakteryzuje się TCP 88
Komunikacja z naciskiem na połączenia i zasada zachowania kolejności 88Kod bajtowy jako podstawowa reprezentacja 88Niezawodność 89Kontrola przepływu 89Kontrola przeciążeń 89
Kup książkę Poleć książkę
SPIS TREŚCI
7
Telnet 89Czat na bazie TCP 92
Tworzymy moduł 92Klasa netServer 92Odbieranie połączeń 94Zdarzenie data 96Stan i monitorowanie połączeń 97Wykończenie 100
Klient IRC 102Tworzymy moduł 102Interfejs netStream 103Implementacja części protokołu IRC 103Test z prawdziwym serwerem IRC 104
Podsumowanie 104
Rozdział 7 Protokoacuteł HTTP 105Struktura HTTP 106Nagłoacutewki 107Połączenia 111Prosty serwer WWW 112
Tworzymy moduł 112Wyświetlamy formularz 112Metody i adresy URL 114Dane 117Składamy elementy w całość 119Dopracowanie szczegoacutełoacutew 120
Klient Twittera 121Tworzymy moduł 121Wysyłanie prostego żądania HTTP 122Wysłanie danych 123Pobieranie tweetoacutew 124
Moduł superagent na pomoc 128Przeładowanie serwera za pomocą narzędzia up 130Podsumowanie 130
Część III Tworzenie aplikacji sieciowych 133
Rozdział 8 Framework Connect 135Prosta strona internetowa przy użyciu modułu http 136Prosta strona internetowa przy użyciu frameworka Connect 139Metody pośredniczące 141
Tworzenie metod pośredniczących wielokrotnego użytku 142Metoda pośrednicząca static 146Metoda pośrednicząca query 148Metoda pośrednicząca logger 148Metoda pośrednicząca bodyParser 150Ciasteczka 153Metoda pośrednicząca session 154
Kup książkę Poleć książkę
SPIS TREŚCI
8
Sesje Redis 159Metoda pośrednicząca methodOverride 160Metoda pośrednicząca basicAuth 160
Podsumowanie 162
Rozdział 9 Framework Express 163Prosta aplikacja Express 164
Tworzymy moduł 164HTML 164Konfiguracja 165Definiowanie tras 166Moduł search 168Uruchomienie aplikacji 169
Ustawienia 170Mechanizmy szablonoacutew 172Obsługa błędoacutew 173Metody złożone 173Trasy 175Metody pośredniczące 177Strategie organizacji 178Podsumowanie 180
Rozdział 10 Technologia WebSocket 181AJAX 182Technologia WebSocket 184Aplikacja Echo 185
Przygotowanie 185Konfiguracja serwera 186Konfiguracja klienta 187Uruchomienie serwera 188
Kursory myszy 189Przygotowanie 189Konfiguracja serwera 189Konfiguracja klienta 192Uruchomienie serwera 194
Kwestie do rozwiązania 194Zamknięcie połączenia a rozłączenie 195JSON 195Ponowne łączenie 195Rozgłaszanie 195WebSocket to HTML5 starsze przeglądarki go nie obsługują 195Rozwiązanie 195
Podsumowanie 196
Rozdział 11 Framework SocketIO 197Transporty 198
Rozłączenie kontra zamknięcie połączenia 198Zdarzenia 198Przestrzenie nazw 199
Kup książkę Poleć książkę
SPIS TREŚCI
9
Czat 200Przygotowanie programu 200Konfiguracja serwera 200Konfiguracja klienta 201Zdarzenia i rozgłaszanie 203Gwarancja odbioru 207
Aplikacja DJ 209Rozszerzenie czata 209Integracja z interfejsem Grooveshark 210Odtwarzanie 213
Podsumowanie 218
Część IV Bazy danych 219
Rozdział 12 MongoDB 221Instalacja 223Dostęp do MongoDB przykład uwierzytelnienia użytkownika 224
Konfiguracja aplikacji 224Tworzymy aplikację Express 224Łączymy się z MongoDB 228Tworzymy dokumenty 230Wyszukiwanie dokumentoacutew 232Metoda pośrednicząca do uwierzytelniania 233Sprawdzanie poprawności danych 234Niepodzielność 235Tryb bezpieczny 235
Wprowadzenie do Mongoose 236Definiowanie modelu 236Definiowanie zagnieżdżonych kluczy 238Definiowanie zagnieżdżonych dokumentoacutew 238Ustawianie indeksoacutew 239Metody pośredniczące 239Sprawdzanie stanu modelu 239Zapytania 240Rozszerzanie zapytań 240Sortowanie 240Wybieranie danych 240Limitowanie wynikoacutew 241Pomijanie wynikoacutew 241Automatyczne wypełnianie kluczy 241Konwersja typoacutew 242
Przykład Mongoose 242Konfiguracja aplikacji 242Refaktoryzacja 243Definiowanie modeli 243
Podsumowanie 245
Kup książkę Poleć książkę
SPIS TREŚCI
10
Rozdział 13 MySQL 247node-mysql 248
Konfiguracja 248Aplikacja Express 248Łączenie z MySQL 249Inicjalizacja skryptu 250Wstawianie danych 253Pobieranie danych 258
Narzędzie Sequelize 259Konfiguracja Sequelize 260Konfiguracja aplikacji Express 260Konfiguracja Sequelize 263Definiowanie modeli i synchronizacja 264Wstawianie danych 266Pobieranie danych 268Usuwanie danych 269Wykończenie 271
Podsumowanie 272
Rozdział 14 Redis 273Instalacja Redis 275Język zapytań Redis 275Typy danych 276
Ciągi znakoacutew 277Tablice asocjacyjne 277Listy 279Zbiory 279Zbiory sortowane 280
Redis i Node 280Implementacja mapy relacji przy użyciu Node i Redis 281
Podsumowanie 290
Część V Testowanie 291
Rozdział 15 Wspoacutełdzielony kod 293Co może być wspoacutełdzielone 294Kompatybilność kodu JavaScript 294
Udostępnianie modułoacutew 295Adaptacja interfejsoacutew programistycznych ECMA 296Adaptacja interfejsoacutew programistycznych Node 297Adaptacja interfejsoacutew programistycznych przeglądarek 298Dziedziczenie dla wszystkich przeglądarek 298
Zastosowanie praktyczne narzędzie browserbuild 299Prosty przykład 300
Podsumowanie 302
Kup książkę Poleć książkę
SPIS TREŚCI
11
Rozdział 16 Testowanie 305Proste testy 306
Przedmiot testoacutew 306Strategia testoacutew 306Program testowy 307
Expectjs 308Przegląd interfejsoacutew programistycznych 308
Mocha 310Testowanie asynchronicznego kodu 311Styl BDD 313Styl TDD 314Styl eksportu 314Korzystanie z Mocha w przeglądarce 315
Podsumowanie 316
Skorowidz 317
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SPIS TREŚCI
7
Telnet 89Czat na bazie TCP 92
Tworzymy moduł 92Klasa netServer 92Odbieranie połączeń 94Zdarzenie data 96Stan i monitorowanie połączeń 97Wykończenie 100
Klient IRC 102Tworzymy moduł 102Interfejs netStream 103Implementacja części protokołu IRC 103Test z prawdziwym serwerem IRC 104
Podsumowanie 104
Rozdział 7 Protokoacuteł HTTP 105Struktura HTTP 106Nagłoacutewki 107Połączenia 111Prosty serwer WWW 112
Tworzymy moduł 112Wyświetlamy formularz 112Metody i adresy URL 114Dane 117Składamy elementy w całość 119Dopracowanie szczegoacutełoacutew 120
Klient Twittera 121Tworzymy moduł 121Wysyłanie prostego żądania HTTP 122Wysłanie danych 123Pobieranie tweetoacutew 124
Moduł superagent na pomoc 128Przeładowanie serwera za pomocą narzędzia up 130Podsumowanie 130
Część III Tworzenie aplikacji sieciowych 133
Rozdział 8 Framework Connect 135Prosta strona internetowa przy użyciu modułu http 136Prosta strona internetowa przy użyciu frameworka Connect 139Metody pośredniczące 141
Tworzenie metod pośredniczących wielokrotnego użytku 142Metoda pośrednicząca static 146Metoda pośrednicząca query 148Metoda pośrednicząca logger 148Metoda pośrednicząca bodyParser 150Ciasteczka 153Metoda pośrednicząca session 154
Kup książkę Poleć książkę
SPIS TREŚCI
8
Sesje Redis 159Metoda pośrednicząca methodOverride 160Metoda pośrednicząca basicAuth 160
Podsumowanie 162
Rozdział 9 Framework Express 163Prosta aplikacja Express 164
Tworzymy moduł 164HTML 164Konfiguracja 165Definiowanie tras 166Moduł search 168Uruchomienie aplikacji 169
Ustawienia 170Mechanizmy szablonoacutew 172Obsługa błędoacutew 173Metody złożone 173Trasy 175Metody pośredniczące 177Strategie organizacji 178Podsumowanie 180
Rozdział 10 Technologia WebSocket 181AJAX 182Technologia WebSocket 184Aplikacja Echo 185
Przygotowanie 185Konfiguracja serwera 186Konfiguracja klienta 187Uruchomienie serwera 188
Kursory myszy 189Przygotowanie 189Konfiguracja serwera 189Konfiguracja klienta 192Uruchomienie serwera 194
Kwestie do rozwiązania 194Zamknięcie połączenia a rozłączenie 195JSON 195Ponowne łączenie 195Rozgłaszanie 195WebSocket to HTML5 starsze przeglądarki go nie obsługują 195Rozwiązanie 195
Podsumowanie 196
Rozdział 11 Framework SocketIO 197Transporty 198
Rozłączenie kontra zamknięcie połączenia 198Zdarzenia 198Przestrzenie nazw 199
Kup książkę Poleć książkę
SPIS TREŚCI
9
Czat 200Przygotowanie programu 200Konfiguracja serwera 200Konfiguracja klienta 201Zdarzenia i rozgłaszanie 203Gwarancja odbioru 207
Aplikacja DJ 209Rozszerzenie czata 209Integracja z interfejsem Grooveshark 210Odtwarzanie 213
Podsumowanie 218
Część IV Bazy danych 219
Rozdział 12 MongoDB 221Instalacja 223Dostęp do MongoDB przykład uwierzytelnienia użytkownika 224
Konfiguracja aplikacji 224Tworzymy aplikację Express 224Łączymy się z MongoDB 228Tworzymy dokumenty 230Wyszukiwanie dokumentoacutew 232Metoda pośrednicząca do uwierzytelniania 233Sprawdzanie poprawności danych 234Niepodzielność 235Tryb bezpieczny 235
Wprowadzenie do Mongoose 236Definiowanie modelu 236Definiowanie zagnieżdżonych kluczy 238Definiowanie zagnieżdżonych dokumentoacutew 238Ustawianie indeksoacutew 239Metody pośredniczące 239Sprawdzanie stanu modelu 239Zapytania 240Rozszerzanie zapytań 240Sortowanie 240Wybieranie danych 240Limitowanie wynikoacutew 241Pomijanie wynikoacutew 241Automatyczne wypełnianie kluczy 241Konwersja typoacutew 242
Przykład Mongoose 242Konfiguracja aplikacji 242Refaktoryzacja 243Definiowanie modeli 243
Podsumowanie 245
Kup książkę Poleć książkę
SPIS TREŚCI
10
Rozdział 13 MySQL 247node-mysql 248
Konfiguracja 248Aplikacja Express 248Łączenie z MySQL 249Inicjalizacja skryptu 250Wstawianie danych 253Pobieranie danych 258
Narzędzie Sequelize 259Konfiguracja Sequelize 260Konfiguracja aplikacji Express 260Konfiguracja Sequelize 263Definiowanie modeli i synchronizacja 264Wstawianie danych 266Pobieranie danych 268Usuwanie danych 269Wykończenie 271
Podsumowanie 272
Rozdział 14 Redis 273Instalacja Redis 275Język zapytań Redis 275Typy danych 276
Ciągi znakoacutew 277Tablice asocjacyjne 277Listy 279Zbiory 279Zbiory sortowane 280
Redis i Node 280Implementacja mapy relacji przy użyciu Node i Redis 281
Podsumowanie 290
Część V Testowanie 291
Rozdział 15 Wspoacutełdzielony kod 293Co może być wspoacutełdzielone 294Kompatybilność kodu JavaScript 294
Udostępnianie modułoacutew 295Adaptacja interfejsoacutew programistycznych ECMA 296Adaptacja interfejsoacutew programistycznych Node 297Adaptacja interfejsoacutew programistycznych przeglądarek 298Dziedziczenie dla wszystkich przeglądarek 298
Zastosowanie praktyczne narzędzie browserbuild 299Prosty przykład 300
Podsumowanie 302
Kup książkę Poleć książkę
SPIS TREŚCI
11
Rozdział 16 Testowanie 305Proste testy 306
Przedmiot testoacutew 306Strategia testoacutew 306Program testowy 307
Expectjs 308Przegląd interfejsoacutew programistycznych 308
Mocha 310Testowanie asynchronicznego kodu 311Styl BDD 313Styl TDD 314Styl eksportu 314Korzystanie z Mocha w przeglądarce 315
Podsumowanie 316
Skorowidz 317
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SPIS TREŚCI
8
Sesje Redis 159Metoda pośrednicząca methodOverride 160Metoda pośrednicząca basicAuth 160
Podsumowanie 162
Rozdział 9 Framework Express 163Prosta aplikacja Express 164
Tworzymy moduł 164HTML 164Konfiguracja 165Definiowanie tras 166Moduł search 168Uruchomienie aplikacji 169
Ustawienia 170Mechanizmy szablonoacutew 172Obsługa błędoacutew 173Metody złożone 173Trasy 175Metody pośredniczące 177Strategie organizacji 178Podsumowanie 180
Rozdział 10 Technologia WebSocket 181AJAX 182Technologia WebSocket 184Aplikacja Echo 185
Przygotowanie 185Konfiguracja serwera 186Konfiguracja klienta 187Uruchomienie serwera 188
Kursory myszy 189Przygotowanie 189Konfiguracja serwera 189Konfiguracja klienta 192Uruchomienie serwera 194
Kwestie do rozwiązania 194Zamknięcie połączenia a rozłączenie 195JSON 195Ponowne łączenie 195Rozgłaszanie 195WebSocket to HTML5 starsze przeglądarki go nie obsługują 195Rozwiązanie 195
Podsumowanie 196
Rozdział 11 Framework SocketIO 197Transporty 198
Rozłączenie kontra zamknięcie połączenia 198Zdarzenia 198Przestrzenie nazw 199
Kup książkę Poleć książkę
SPIS TREŚCI
9
Czat 200Przygotowanie programu 200Konfiguracja serwera 200Konfiguracja klienta 201Zdarzenia i rozgłaszanie 203Gwarancja odbioru 207
Aplikacja DJ 209Rozszerzenie czata 209Integracja z interfejsem Grooveshark 210Odtwarzanie 213
Podsumowanie 218
Część IV Bazy danych 219
Rozdział 12 MongoDB 221Instalacja 223Dostęp do MongoDB przykład uwierzytelnienia użytkownika 224
Konfiguracja aplikacji 224Tworzymy aplikację Express 224Łączymy się z MongoDB 228Tworzymy dokumenty 230Wyszukiwanie dokumentoacutew 232Metoda pośrednicząca do uwierzytelniania 233Sprawdzanie poprawności danych 234Niepodzielność 235Tryb bezpieczny 235
Wprowadzenie do Mongoose 236Definiowanie modelu 236Definiowanie zagnieżdżonych kluczy 238Definiowanie zagnieżdżonych dokumentoacutew 238Ustawianie indeksoacutew 239Metody pośredniczące 239Sprawdzanie stanu modelu 239Zapytania 240Rozszerzanie zapytań 240Sortowanie 240Wybieranie danych 240Limitowanie wynikoacutew 241Pomijanie wynikoacutew 241Automatyczne wypełnianie kluczy 241Konwersja typoacutew 242
Przykład Mongoose 242Konfiguracja aplikacji 242Refaktoryzacja 243Definiowanie modeli 243
Podsumowanie 245
Kup książkę Poleć książkę
SPIS TREŚCI
10
Rozdział 13 MySQL 247node-mysql 248
Konfiguracja 248Aplikacja Express 248Łączenie z MySQL 249Inicjalizacja skryptu 250Wstawianie danych 253Pobieranie danych 258
Narzędzie Sequelize 259Konfiguracja Sequelize 260Konfiguracja aplikacji Express 260Konfiguracja Sequelize 263Definiowanie modeli i synchronizacja 264Wstawianie danych 266Pobieranie danych 268Usuwanie danych 269Wykończenie 271
Podsumowanie 272
Rozdział 14 Redis 273Instalacja Redis 275Język zapytań Redis 275Typy danych 276
Ciągi znakoacutew 277Tablice asocjacyjne 277Listy 279Zbiory 279Zbiory sortowane 280
Redis i Node 280Implementacja mapy relacji przy użyciu Node i Redis 281
Podsumowanie 290
Część V Testowanie 291
Rozdział 15 Wspoacutełdzielony kod 293Co może być wspoacutełdzielone 294Kompatybilność kodu JavaScript 294
Udostępnianie modułoacutew 295Adaptacja interfejsoacutew programistycznych ECMA 296Adaptacja interfejsoacutew programistycznych Node 297Adaptacja interfejsoacutew programistycznych przeglądarek 298Dziedziczenie dla wszystkich przeglądarek 298
Zastosowanie praktyczne narzędzie browserbuild 299Prosty przykład 300
Podsumowanie 302
Kup książkę Poleć książkę
SPIS TREŚCI
11
Rozdział 16 Testowanie 305Proste testy 306
Przedmiot testoacutew 306Strategia testoacutew 306Program testowy 307
Expectjs 308Przegląd interfejsoacutew programistycznych 308
Mocha 310Testowanie asynchronicznego kodu 311Styl BDD 313Styl TDD 314Styl eksportu 314Korzystanie z Mocha w przeglądarce 315
Podsumowanie 316
Skorowidz 317
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SPIS TREŚCI
9
Czat 200Przygotowanie programu 200Konfiguracja serwera 200Konfiguracja klienta 201Zdarzenia i rozgłaszanie 203Gwarancja odbioru 207
Aplikacja DJ 209Rozszerzenie czata 209Integracja z interfejsem Grooveshark 210Odtwarzanie 213
Podsumowanie 218
Część IV Bazy danych 219
Rozdział 12 MongoDB 221Instalacja 223Dostęp do MongoDB przykład uwierzytelnienia użytkownika 224
Konfiguracja aplikacji 224Tworzymy aplikację Express 224Łączymy się z MongoDB 228Tworzymy dokumenty 230Wyszukiwanie dokumentoacutew 232Metoda pośrednicząca do uwierzytelniania 233Sprawdzanie poprawności danych 234Niepodzielność 235Tryb bezpieczny 235
Wprowadzenie do Mongoose 236Definiowanie modelu 236Definiowanie zagnieżdżonych kluczy 238Definiowanie zagnieżdżonych dokumentoacutew 238Ustawianie indeksoacutew 239Metody pośredniczące 239Sprawdzanie stanu modelu 239Zapytania 240Rozszerzanie zapytań 240Sortowanie 240Wybieranie danych 240Limitowanie wynikoacutew 241Pomijanie wynikoacutew 241Automatyczne wypełnianie kluczy 241Konwersja typoacutew 242
Przykład Mongoose 242Konfiguracja aplikacji 242Refaktoryzacja 243Definiowanie modeli 243
Podsumowanie 245
Kup książkę Poleć książkę
SPIS TREŚCI
10
Rozdział 13 MySQL 247node-mysql 248
Konfiguracja 248Aplikacja Express 248Łączenie z MySQL 249Inicjalizacja skryptu 250Wstawianie danych 253Pobieranie danych 258
Narzędzie Sequelize 259Konfiguracja Sequelize 260Konfiguracja aplikacji Express 260Konfiguracja Sequelize 263Definiowanie modeli i synchronizacja 264Wstawianie danych 266Pobieranie danych 268Usuwanie danych 269Wykończenie 271
Podsumowanie 272
Rozdział 14 Redis 273Instalacja Redis 275Język zapytań Redis 275Typy danych 276
Ciągi znakoacutew 277Tablice asocjacyjne 277Listy 279Zbiory 279Zbiory sortowane 280
Redis i Node 280Implementacja mapy relacji przy użyciu Node i Redis 281
Podsumowanie 290
Część V Testowanie 291
Rozdział 15 Wspoacutełdzielony kod 293Co może być wspoacutełdzielone 294Kompatybilność kodu JavaScript 294
Udostępnianie modułoacutew 295Adaptacja interfejsoacutew programistycznych ECMA 296Adaptacja interfejsoacutew programistycznych Node 297Adaptacja interfejsoacutew programistycznych przeglądarek 298Dziedziczenie dla wszystkich przeglądarek 298
Zastosowanie praktyczne narzędzie browserbuild 299Prosty przykład 300
Podsumowanie 302
Kup książkę Poleć książkę
SPIS TREŚCI
11
Rozdział 16 Testowanie 305Proste testy 306
Przedmiot testoacutew 306Strategia testoacutew 306Program testowy 307
Expectjs 308Przegląd interfejsoacutew programistycznych 308
Mocha 310Testowanie asynchronicznego kodu 311Styl BDD 313Styl TDD 314Styl eksportu 314Korzystanie z Mocha w przeglądarce 315
Podsumowanie 316
Skorowidz 317
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SPIS TREŚCI
10
Rozdział 13 MySQL 247node-mysql 248
Konfiguracja 248Aplikacja Express 248Łączenie z MySQL 249Inicjalizacja skryptu 250Wstawianie danych 253Pobieranie danych 258
Narzędzie Sequelize 259Konfiguracja Sequelize 260Konfiguracja aplikacji Express 260Konfiguracja Sequelize 263Definiowanie modeli i synchronizacja 264Wstawianie danych 266Pobieranie danych 268Usuwanie danych 269Wykończenie 271
Podsumowanie 272
Rozdział 14 Redis 273Instalacja Redis 275Język zapytań Redis 275Typy danych 276
Ciągi znakoacutew 277Tablice asocjacyjne 277Listy 279Zbiory 279Zbiory sortowane 280
Redis i Node 280Implementacja mapy relacji przy użyciu Node i Redis 281
Podsumowanie 290
Część V Testowanie 291
Rozdział 15 Wspoacutełdzielony kod 293Co może być wspoacutełdzielone 294Kompatybilność kodu JavaScript 294
Udostępnianie modułoacutew 295Adaptacja interfejsoacutew programistycznych ECMA 296Adaptacja interfejsoacutew programistycznych Node 297Adaptacja interfejsoacutew programistycznych przeglądarek 298Dziedziczenie dla wszystkich przeglądarek 298
Zastosowanie praktyczne narzędzie browserbuild 299Prosty przykład 300
Podsumowanie 302
Kup książkę Poleć książkę
SPIS TREŚCI
11
Rozdział 16 Testowanie 305Proste testy 306
Przedmiot testoacutew 306Strategia testoacutew 306Program testowy 307
Expectjs 308Przegląd interfejsoacutew programistycznych 308
Mocha 310Testowanie asynchronicznego kodu 311Styl BDD 313Styl TDD 314Styl eksportu 314Korzystanie z Mocha w przeglądarce 315
Podsumowanie 316
Skorowidz 317
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SPIS TREŚCI
11
Rozdział 16 Testowanie 305Proste testy 306
Przedmiot testoacutew 306Strategia testoacutew 306Program testowy 307
Expectjs 308Przegląd interfejsoacutew programistycznych 308
Mocha 310Testowanie asynchronicznego kodu 311Styl BDD 313Styl TDD 314Styl eksportu 314Korzystanie z Mocha w przeglądarce 315
Podsumowanie 316
Skorowidz 317
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
PODRĘCZNIK NODEJS
ROZD
ZIA
Ł5
WIERSZ POLECEŃI MODUŁ FSTWOJA PIERWSZAAPLIKACJA
W TYM ROZDZIALE ZAJMIEMY SIĘjednymi z najważniejszych interfejsoacutewprogramistycznych NodeJS interfejsamizwiązanymi z obsługą strumieniawejściowego (stdin) i wyjściowego(stdout) procesu oraz interfejsamizwiązanymi z systemem plikoacutew (moduł fs)
Jak już wiemy z poprzedniego rozdziałukluczowe w sposobie obsługi wspoacutełbieżnościprzez Node jest użycie wywołań zwrotnych
i zdarzeń Dzięki tym interfejsompoznasz kontrolę przepływu w procesieprogramowania z wykorzystaniem zdarzeńi nieblokujących operacji wejścia-wyjścia
Wiedzę na temat tych interfejsoacutew i ichinterakcji sprawdzisz tworząc swojąpierwszą aplikację prosty uruchamianyz wiersza poleceń eksplorator plikoacutew ktoacuteryumożliwi użytkownikowi tworzenie nowychoraz odczyt zawartości istniejących plikoacutew
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
68
WYMAGANIANa początek określ jakie zadania powinien wykonywać program
Chcesz żeby program uruchamiany był z wiersza poleceń Oznacza to że będzieuruchamiany albo za pomocą polecenia node albo bezpośrednio a dalsza interakcjaz użytkownikiem będzie się odbywać przez terminal
Po uruchomieniu program powinien wyświetlić listę bieżących katalogoacutew(zob rysunek 51)
Rysunek 51 Lista bieżących katalogoacutew wyświetlana przy starcie programu
Po wybraniu pliku program powinien wyświetlić jego zawartość Po wybraniu katalogu program powinien wyświetlić jego podkatalogi Następnie program powinien się zakończyć
Biorąc pod uwagę powyższe projekt można rozbić na kilka mniejszych etapoacutew
1 Utworzenie naszego modułu2 Wybranie synchronicznej lub asynchronicznej wersji modułu fs3 Zrozumienie strumieni4 Przeprowadzenie operacji wejścia i wyjścia5 Refaktoring6 Interakcja z modułem fs7 Dopracowanie szczegoacutełoacutew
PISZEMY NASZ PIERWSZY PROGRAMZbudujesz teraz moduł na bazie wymienionych powyżej krokoacutew Moduł będzie złożonyz kilku plikoacutew ktoacutere utworzysz za pomocą dowolnego edytora tekstu
Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programemnapisanym w całości w NodeJS
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
69
TWORZYMY MODUŁJak w każdym przykładzie w tej książce zaczniemy od utworzenia katalogu zawierającegonasz projekt Na potrzeby przykładu nazwiemy go file-explorer
W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku packagejsondla każdego projektu Zachowujesz w ten sposoacuteb kontrolę nad zależnościami określonymiw rejestrze NPM i możliwość publikacji modułoacutew w przyszłości
Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułoacutew Node(a więc niepobieranych z rejestru NPM) musimy przygotować prosty plik packagejson
packagejson name file-explorer version 001 description Eksplorator plikoacutew w wierszu polece
Uwaga NPM wprowadza numerację kontroli wersji według tzw konwencji semverTo dlatego zamiast bdquo01rdquo lub bdquo1rdquo w polu version podajemy wartość bdquo001rdquo
Aby zweryfikować poprawność pliku packagejson wydaj polecenie $ npm install
Jeżeli wszystko działa nie powinny zostać wyświetlone żadne błędy1 W innym razie pojawisię wyjątek JSON (zob rysunek 52)
Rysunek 52 Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku packagejson
W następnej kolejności utworzysz plik JavaScript indexjs ktoacutery będzie zawierał podstawowykod programu
1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia mdash przyp tłum
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
70
SYNC CZY ASYNCNa początek zadeklaruj w swoim pliku zależności Ponieważ interfejsy stdio są częściązmiennej globalnej process jedyną zależnością będzie moduł fs
indexjs Zale no ci modu u
var fs = require(fs)
Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plikoacutew w bieżącymkatalogu
Musisz przy tym pamiętać że interfejs programistyczny fs jest wyjątkowy w tym sensieże pozwala zaroacutewno na blokujące jak i nieblokujące wywołania Jeśli na przykład chceszpobrać listę istniejących katalogoacutew możesz to zrobić w następujący sposoacuteb
gt consolelog(require(fs)readdirSync(__dirname))
Wywołanie zwroacuteci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu(zob rysunek 53)
Rysunek 53 Sprawdzanie wartości readdirSync
Innym podejściem jest rozwiązanie asynchroniczne
gt function async (err files) consolelog(files) gt require(fs)readdir( async)
Da ono identyczne wyniki pokazane na rysunku 54
Rysunek 54 Asynchroniczna wersja readdir
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
71
Z rozdziału 3 wiemy że aby nasze aplikacje były szybkie i radziły sobie z obsługą wspoacutełbieżnościw jednym wątku przy dużym obciążeniu muszą obsługiwać zdarzenia asynchronicznie
Nasz prosty program wiersza poleceń z pewnością nie będzie funkcjonował w takim środowisku(w danym momencie obsługiwać go będzie tylko jedna osoba) ale aby poznać dobrze jednoz najważniejszych i najtrudniejszych zagadnień związanych z NodeJS zastosujesz rozwiązanieasynchroniczne
Do uzyskania listy plikoacutew wykorzystamy zatem metodę fsreaddir Przekazywane wywołaniezwrotne dostarcza obiekt błędu (ktoacutery ma wartość null w przypadku braku błędu) i tablicęfiles
indexjs fsreaddir(__dirname function (err files) consolelog(files))
Sproacutebuj wywołać program Otrzymany rezultat powinien być podobny do tego z rysunku 55
Rysunek 55 Twoacutej pierwszy program w akcji
Teraz kiedy już wiesz że moduł fs zawiera zaroacutewno synchroniczne jak i asynchronicznemetody dostępu do systemu plikoacutew musisz jeszcze poznać fundamentalne dla NodeJS pojęciejakim są strumienie
ZROZUMIENIE STRUMIENIJak prawdopodobnie zauważyłeś metoda consolelog wyświetla dane w konsoli A uściślającconsolelog wykonuje konkretne zadanie zapisuje do strumienia wyjścia stdout podanyprzez użytkownika łańcuch znakoacutew wraz ze znakiem nowego wiersza n
Zwroacuteć uwagę na roacuteżnicę w wyświetlaniu na rysunku 56
A teraz spoacutejrz na kod źroacutedłowy
example-1jsconsolelog(Witaj wiecie)
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
72
Rysunek 56 W pierwszym przykładzie po bdquoWitaj świecierdquo następuje znak nowego wiersza w drugim już nie
oraz
example-2jsprocessstdoutwrite(Witaj wiecie)
Globalna zmienna procesu zawiera trzy obiekty Stream odpowiadające trzem standardowymstrumieniom w systemie Unix
- stdin Standard input- stdout Standard output- stderr Standard error
Rolę tych obiektoacutew zilustrowano na rysunku 57
Rysunek 57 Obiekty stdin stdout i stderr w kontekście tradycyjnego terminala tekstowego
Pierwszy z nich stdin jest strumieniem do odczytu podczas gdy stdout i stderr sąstrumieniami do zapisu
Domyślnym stanem strumienia stdin jest stan wstrzymania (paused) Z reguły pouruchomieniu program wykonuje pewne zadania po czym kończy działanie Czasami jednaki tak jest roacutewnież w naszej aplikacji program oczekuje na dane i przynajmniej dopoacutekinie zostaną one wprowadzone przez użytkownika nie może zakończyć działania
Kiedy wznawiasz ten strumień (za pomocą metody resume) Node obserwuje odpowiednideskryptor pliku (ktoacutery w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętlizdarzeń nie kończy programu czekając na wywołanie zdarzeń NodeJS zawsze kończy działanieautomatycznie chyba że oczekuje na dane wejścia-wyjścia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
73
Inną ciekawą własnością obiektu Stream jest to że posiada on domyślne kodowanie Jeśliustawisz kodowanie dla strumienia zamiast surowego obiektu Buffer otrzymasz zakodowanyłańcuch tekstowy (za pomocą UTF-8 ASCII itd) jako parametry zdarzeń
Obiekt Stream jest podstawowym elementem wykorzystywanym przy budowie aplikacjiw Node podobnie jak obiekt EventEmitter (po ktoacuterym zresztą dziedziczy) Podczas pracyz Node często będziesz się spotykać z roacuteżnego rodzaju strumieniami takimi jak gniazda TCPczy żądania HTTP W skroacutecie wszędzie tam gdzie mamy do czynienia ze stopniowym odczytemlub zapisem danych obecne są strumienie
WEJŚCIE I WYJŚCIETeraz kiedy masz już pewne pojęcie o tym co dzieje się po uruchomieniu programu możeszprzystąpić do tworzenia pierwszej części aplikacji Wyświetli ona listę plikoacutew w bieżącymkatalogu i poczeka na dane wprowadzane przez użytkownika
indexjs fsreaddir(processcwd() function (err files) consolelog()
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
consolelog( Wybierz plik lub katalog ktoacutery chcesz zobaczy n)
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
i++ if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() else file(i) )
file(0))
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
74
Przeanalizujmy ten kod wiersz po wierszu
Aby zwiększyć przejrzystość tekstu wstawiamy pusty wiersz
consolelog()
Następnie dodajemy komunikat o braku plikoacutew do wyświetlenia jeśli tablica plikoacutew jest pustaŁańcuchy 033[31m i 033[39m otaczające tekst nadają mu czerwony kolor Na końcuznajduje się znak nowego wiersza n służący do wizualnego rozdzielenia tekstu
if (fileslength) return consolelog( 033[31m Brak plikoacutew do wy wietlenia033[39mn)
Kolejnego wiersza nie trzeba objaśniać
consolelog( Select which file or directory you want to seen)
Definiujemy funkcję ktoacutera będzie wywołana dla każdego elementu tablicy Jest to pierwszyze wzorcoacutew asynchronicznej kontroli przepływu używanych w tej książce przetwarzaniewsadowe (ang serial execution) Pod koniec rozdziału zajmiemy się nim bardziej szczegoacutełowo
function file (i)
Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaciobiektu Stat Obiekt fsstat dostarcza nam roacuteżne metadane pliku lub katalogu
var filename = files[i]
fsstat(__dirname + + filename function (err stat) )
Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat W tymprzypadku interesuje nas metoda isDirectory tego ostatniego
if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
Jeśli ścieżka jest katalogiem zostanie wyświetlona w innym kolorze niż pliki
Dalej następuje najważniejsza część kontroli przepływu Zwiększamy indeks o jedenbezpośrednio po czym sprawdzamy czy pozostały jeszcze jakieś pliki do przetworzenia
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
75
i++if (i == fileslength) consolelog() processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m) processstdinresume() processstdinsetEncoding(utf8) else file(i)
Jeżeli nie ma już więcej plikoacutew użytkownik proszony jest o wyboacuter opcji Zauważ że posługujemysię tu metodą processstdoutwrite zamiast consolelog nie chcemy przenosić kursorado nowego wiersza użytkownik wprowadza swoacutej wyboacuter bezpośrednio po komunikacie (zobrysunek 58)
consolelog()processstdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
Rysunek 58 Aktualna wersja programu prosi o wprowadzenie danych wejściowych
Jak już wiesz poniższy wiersz pozwala na pobranie danych od użytkownika
processstdinresume()
W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8 zapewniając obsługęznakoacutew specjalnych i diakrytycznych
processstdinsetEncoding(utf8)
Jeśli są jeszcze pliki do przetworzenia nasza funkcja zostaje wywołana w sposoacuteb rekurencyjnyponownie
file(i)
Proces jest kontynuowany dopoacuteki wszystkie pliki nie zostaną przetworzone po czymużytkownik proszony jest o wprowadzenie danych Tym sposobem najważniejsza częśćaplikacji jest już prawie gotowa
REFAKTORINGRefaktoring zaczniemy od dodania przydatnych skroacutetoacutew jako że stdin i stdout będą przeznas używane stosunkowo często
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
76
indexjs var fs = require(fs) stdin = processstdin stdout = processstdout
Ponieważ kod jest asynchroniczny ryzykujemy że wraz z rozbudową programu (szczegoacutelniejeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszyczytelność kodu
Aby temu zapobiec możesz oddzielnie zdefiniować funkcje reprezentujące poszczegoacutelneetapy asynchronicznego procesu
Na początek wyodrębnij funkcję odczytującą stdin
indexjs wywo ywana dla ka dego pliku w katalogufunction file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) if (statisDirectory()) consolelog( +i+ 033[36m + filename + 033[39m) else consolelog( +i+ 033[90m + filename + 033[39m)
if (++i == fileslength) read() else file(i) )
odczytaj dane u ytkownika po wy wietleniu plikoacutewfunction read () consolelog() stdoutwrite( 033[33mWprowad swoacutej wyboacuter 033[39m)
stdinresume() stdinsetEncoding(utf8)
Zwroacuteć uwagę że wykorzystujesz roacutewnież nowe zmienne pomocnicze stdin i stdout
Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie Użytkownikjest proszony o wybranie pliku ktoacutery ma zostać odczytany Po ustawieniu kodowaniadla strumienia stdin zaczynamy nasłuchiwać zdarzenia data
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
77
function read () stdinon(data option)
wywo ywana z opcj wybran przez u ytkownikafunction option (data) if (files[Number(data)]) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause()
Sprawdzamy tutaj czy istnieje indeks tablicy files odpowiadający wyborowi użytkownikaPamiętaj że tablica files jest częścią wywołania zwrotnego (fsreaddir) w obrębie ktoacuteregocały czas się znajdujesz Zwroacuteć też uwagę na konwersję łańcucha utf-8 data do typu Numberprzed dokonaniem sprawdzenia
Jeżeli indeks tablicy istnieje strumień musi zostać ponownie wstrzymany (wracając do stanudomyślnego) aby mdash po wykonaniu operacji fs opisanych w kolejnym kroku mdash program moacutegłzakończyć działanie (zob rysunek 59)
Rysunek 59 Przykład źle wprowadzonego wyboru
Teraz kiedy nasz program jest już zdolny do interakcji z użytkownikiem prezentując mu listęplikoacutew do wyboru możemy zająć się ich odczytem i wyświetleniem
INTERAKCJA Z MODUŁEM FSKod odpowiedzialny za odszukiwanie plikoacutew jest gotowy czas zatem na ich odczyt
function option (data) var filename = files[Number(data)] if (filename) stdoutwrite( 033[31mWprowad swoacutej wyboacuter 033[39m) else stdinpause() fsreadFile(__dirname + + filename utf8 function (err data) consolelog()
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
78
consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Zauważ że roacutewnież tym razem możesz określić kodowanie z goacutery otrzymując gotowydo użycia łańcuch tekstowy
fsreadFile(__dirname + + filename utf8 function (err data)
Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob rysunek 510)
datareplace(()g $1)
Rysunek 510 Przykład odczytu prostego pliku
Co jeśli użytkownik wybrał katalog W takiej sytuacji muszą zostać wyświetlone podkatalogii pliki ktoacutere zawiera
Aby uniknąć wielokrotnego wywoływania fsstat wroacuteć do funkcji file i dodaj instrukcjęzapisującą odwołania do obiektoacutew Stats
var stats = []
function file(i) var filename = files[i]
fsstat(__dirname + + filename function (err stat) stats[i] = stat
Teraz możesz sprawdzić czy użytkownik wybrał katalog w funkcji option W miejscu w ktoacuterymwcześniej znajdowało się wywołanie fsreadFile wstaw
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
79
if (stats[Number(data)]isDirectory()) fsreaddir(__dirname + + filename function (err files) consolelog() consolelog( (plikoacutew + fileslength + )) filesforEach(function (file) consolelog( - + file) ) consolelog() ) else fsreadFile(__dirname + + filename utf8 function (err data) consolelog() consolelog(033[90m + datareplace(()g $1) + 033[39m) )
Jeśli uruchomisz teraz program po wybraniu katalogu zobaczysz listę plikoacutew ktoacutere mogązostać odczytane do wyboru (zob rysunek 511)
Rysunek 511 Przykład odczytu katalogu test
I to już wszystko Właśnie napisałeś swoacutej pierwszy program wiersza poleceń w Node
WIERSZ POLECEŃMasz już za sobą pierwszy program wiersza poleceń warto zatem poznać kolejne interfejsyprogramistyczne pomocne w tworzeniu podobnych aplikacji uruchamianych w terminalu
OBIEKT ARGVObiekt processargv zawiera wartości wszystkich argumentoacutew z jakimi program Nodezostał uruchomiony
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
80
examplejsconsolelog(processargv)
Na rysunku 512 widzimy że pierwszym elementem jest zawsze node a drugim ścieżkado uruchamianego pliku Kolejne elementy są argumentami podanymi w poleceniu
Rysunek 512 Przykładowa zawartość processargv
Aby pominąć pierwsze dwa elementy użyj metody slice (zob rysunek 513)
example-2jsconsolelog(processargvslice(2))
Rysunek 513 Przykład okrojonej wersji obiektu argv zawierającej tylko argumenty podane przy uruchomieniu programu
Kolejną bardzo ważną rzeczą przy pracy z Node jest zrozumienie roacuteżnicy pomiędzy katalogiemw ktoacuterym program rezyduje a katalogiem w ktoacuterym jest uruchamiany
KATALOG ROBOCZYW przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz siędo katalogu w ktoacuterym znajduje się w systemie plikoacutew uruchamiany plik
Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącegokatalogu roboczego (ang current working directory) Zgodnie z aktualną implementacjąniezależnie od tego czy znajdujesz się w katalogu macierzystym czy w dowolnym innymkatalogu uruchomienie aplikacji da taki sam wynik Położenie pliku indexjs się nie zmieniaa więc wartość __dirname też pozostaje taka sama
Aby uzyskać bieżący katalog roboczy wywołaj metodę processcwd
gt processcwd()Usersguillermo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
81
Node umożliwia roacutewnież jego zmianę dzięki metodzie processchdir
gt processcwd()Usersguillermogt processchdir()gt processcwd()
Kolejny aspekt kontekstu w ktoacuterym uruchamiany jest program to obecność zmiennychśrodowiskowych W następnym punkcie pokażemy jak uzyskać dostęp do tych zmiennych
ZMIENNE ŚRODOWISKOWENode pozwala na łatwy dostęp do zmiennych ktoacutere są częścią środowiska powłoki poprzezwygodny obiekt processenv
Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob rysunek 514) ktoacuterejnajczęstszym zastosowaniem jest informowanie programu Node czy działa w środowiskuprodukcyjnym czy deweloperskim
Rysunek 514 Zmienna środowiskowa NODE_ENV
W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jegozakończeniem
ZAKAŃCZANIE PROGRAMUAby zakończyć aplikację możesz użyć metody processexit z opcjonalnym kodemzakończenia Jeśli na przykład chcemy aby program zakończył się błędem najlepiej użyćkodu 1
consoleerror(Wyst pi b d)processexit(1)
Pozwala to na sprawną wspoacutełpracę pomiędzy programami wiersza poleceń i innyminarzędziami w systemie operacyjnym
Innym ważnym aspektem tej wspoacutełpracy są sygnały procesu
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
82
SYGNAŁYProces komunikuje się z systemem operacyjnym na roacuteżne sposoby Jednym z nich są sygnały(ang signals) Kiedy chcemy na przykład natychmiastowo zakończyć proces wystarczy muwysłać sygnał SIGKILL
Sygnały są w Node emitowane jako zdarzenia obiektu process
processon(SIGKILL function () signal received)
W następnym punkcie wyjaśnimy jak uzyskaliśmy w naszej przykładowej aplikacji kolorowytekst
SEKWENCJE STERUJĄCE ANSIChcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowymkorzystamy z sekwencji sterujących ANSI (ang ANSI escape sequences) zwanych roacutewnieżkodami ANSI Te znaki specjalne są rozpoznawane przez emulator terminala w standardowysposoacuteb
Kiedy umieszczasz między tymi znakami tekst nie pojawią się one oczywiście na ekranieSą to tak zwane znaki niedrukowalne (ang nonprinting characters)
Weźmy na przykład następujące sekwencje
consolelog(033[90m + datareplace(()g $1) + 033[39m)
033 rozpoczyna sekwencję sterującą [ informuje o zmianie koloru 90 zmienia kolor tekstu na jasnoszary m kończy sekwencję
Zwroacuteć uwagę że w drugiej sekwencji używamy wartości 39 ktoacutera powoduje powroacutet dalszegotekstu do domyślnego dla terminala koloru
Kompletną tabelę kodoacutew ANSI znajdziesz pod adresem httpenwikipediaorgwikiANSI_escape_code
MODUŁ FSModuł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny StreamW przeciwieństwie do metod readFile i writeFile przydział pamięci odbywa się w jegoprzypadku stopniowo
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
83
Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszyJednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużegoobszaru pamięci Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymiprzez znaki końca wiersza (bdquonrdquo) i ich przetwarzanie na bieżąco
Strumienie Node nadają się do tego idealnie o czym przekonasz się już zaraz
STRUMIENIEMetoda fscreateReadStream pozwala utworzyć strumień do odczytu (ang readable)dla danego pliku
Potencjał strumieni najlepiej ilustruje roacuteżnica pomiędzy dwoma zamieszczonymi niżejprzykładami
fsreadFile(my-filetxt function (err contents) zroacuteb co z plikiem)
W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero kiedy całazawartość pliku będzie wczytana umieszczona w pamięci operacyjnej i gotowa do użycia
W poniższym przykładzie natomiast plik odczytywany jest partiami o zmiennym rozmiarzeFunkcja zwrotna wywoływana jest przy odczycie każdej partii
var stream = fscreateReadStream(my-filetxt)streamon(data function(chunk) zroacuteb co z cz ci pliku)streamon(end function(chunk) osi gni to koniec pliku)
Dlaczego ta zdolność strumieni jest taka ważna Wyobraź sobie że musisz przesłać do usługisieciowej bardzo duży plik wideo Wczytanie całego pliku nie jest konieczne do rozpoczęciaprzesyłania tak więc użycie strumienia przekłada się bezpośrednio na szybkość całej operacji
To samo dotyczy zapisu w pliku dziennika zwłaszcza jeśli korzystamy ze strumieniado zapisu (ang writable) Jeżeli używasz aplikacji sieciowej do zapisywania działańużytkownikoacutew odwiedzających Twoją stronę w pliku dziennika zmuszanie systemuoperacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie odszukaniago na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń
W takim przypadku dużo lepiej użyć obiektu fsWriteStream otwierając plik raz a następniewywołując metodę write przy każdym nowym wpisie
Kolejnym ważnym elementem modelu pracy Node polegającego na nieblokowaniu operacjiwejścia-wyjścia jest obserwacja
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
CZĘŚĆ II NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE
84
OBSERWACJANode umożliwia obserwowanie plikoacutew i katalogoacutew pod kątem zmian Obserwując dany pliklub katalog jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdejmodyfikacji pliku (lub plikoacutew zawartych w katalogu)
Mechanizm ten jest często wykorzystywany w środowisku Node Niektoacuterzy wolą na przykładprzygotowywać arkusze styloacutew CSS w sposoacuteb pośredni Wprowadzają oni kod w językuprogramowania ktoacutery jest następnie kompilowany do postaci CSS Automatyczna kompilacjapo każdej modyfikacji pliku jest bardzo wygodna
Rozważmy następujący przykład Na początek szukamy wszystkich plikoacutew CSS w kataloguroboczym a następnie obserwujemy je pod kątem zmian Po wykryciu zmiany plik jestwyświetlany w konsoli
var fs = require(fs)var stream = fscreateReadStream(my-filetxt) pobierz wszystkie pliki z katalogu roboczegovar files = fsreaddirSync(processcwd())filesforEach(function (file) obserwuj plik je li ko czy si css if (csstest(file)) fswatchFile(processcwd() + + file function () consolelog( ndash + file + zmieniony) ) )
Oproacutecz metody fswatchFile możesz roacutewnież skorzystać z metody fswatch ktoacutera pozwalana obserwację całych katalogoacutew
PODSUMOWANIEW tym rozdziale poznałeś podstawy tworzenia aplikacji w NodeJS a dokładniej programuwiersza poleceń ktoacutery komunikował się z systemem plikoacutew
Chociaż ten konkretny program moacutegł zostać napisany przy użyciu synchronicznych interfejsoacutewmodułu fs skorzystaliśmy z interfejsoacutew asynchronicznych aby lepiej zrozumieć pewneniuanse tworzenia kodu z dużą liczbą wywołań zwrotnych Niezależnie od tego udało namsię uzyskać opisowy i w pełni funkcjonalny kod
Omoacutewiony w tym rozdziale jeden z najważniejszych interfejsoacutew programistycznych Streambędzie się często przewijał w dalszej części książki Prawie wszędzie tam gdzie mamy do czynieniaz operacjami wejścia-wyjścia użycie strumieni jest nieuniknione
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
ROZDZIAŁ 5 WIERSZ POLECEŃ I MODUŁ FS TWOJA PIERWSZA APLIKACJA
85
Otrzymałeś też dużo wskazoacutewek i narzędzi dzięki ktoacuterym jesteś w stanie pisać złożonei przydatne programy wykorzystujące system plikoacutew komunikujące się z innymi aplikacjamii pobierające dane od użytkownika
Jako programista NodeJS będziesz tę wiedzę (a szczegoacutelnie jej część odnoszącą się do procesu)wykorzystywać bardzo często zaroacutewno podczas tworzenia aplikacji sieciowych jak i podczasrozwiązywania bardziej złożonych problemoacutew Postaraj się ją zatem dobrze przyswoić
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
Skorowidz
Aacknowledgment Patrz potwierdzenieadaptacja 294adres
permalink 176URL 44 113 114 115 116 120 126 137
139 147kodowanie 118a cuch zapytania Patrz a cuch zapytania
uko nik 171AJAX 182 198 260 262ANSI escape sequences Patrz sekwencja
steruj ca ANSIarkusz styloacutew CSS Patrz CSSassertion Patrz test sprawdzaj cyatomicity Patrz niepodzielno operacjiautoryzacja 141 161AWS Patrz chmura Amazon
Bbaza danych Patrz te sprawdzanie poprawno ci
bezschematowa 221MySQL 258oparta na dokumentach 221pojedyncza 236Redis Patrz RedisSQL 250
BDD 313behavior-driven development Patrz BDDbiblioteka
jQuery Patrz jQuerykryptograficzna 294matematyczna 294OpenSSL 23
blog 235 238b d 50 81 168 173 231 252 306
funkcji od o onej w czasie 52po czenia 95
browserbuild 293 299bufor 63
Ccall stack Patrz stos wywo acallback Patrz wywo anie zwrotnechmura 49Chrome 38 296ciasteczka 153ci g znakoacutew 277closure Patrz domkni cieConnect 135 139 177connection Patrz po czenieconsumer key 125consumer secret 125controller Patrz kontrolerCSS 84current working directory Patrz katalog
roboczy bie cyczat 92 200 207
rozszerzenia 209u ytkownik 97 98 99 100
DDahl Ryan 13 15dane
baza Patrz baza danychpakiet 88sesji 159sprawdzanie poprawno ci 235struktura 119strumie Patrz strumie danychtyp Patrz typ danychwysy anie 110 123
data stream Patrz strumie danychdatagram 88dependencies 27dokument 222
g boko 222ograniczanie liczby 241pomijanie 241szukanie 228tworzenie 230
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SKOROWIDZ
318
318
dokumentwstawianie 228wyszukiwanie 232zagnie d ony 238
domkni cie 31 35Donrsquot Repeat Yourself Patrz DRYDRY 139dziedziczenie 40 87 298
klasyczne 36a cuch 36
prototypowe 36dziennik 83 141 142 149
EECMAScript 38EJS 164Embedded JavaScript Patrz EJSevent Patrz zdarzenieEventEmitter 297execution stack Patrz stos wywo aExpress 17 163 170 177 248
Ffile descriptor Patrz plik deskryptorFirebug 17firewall 195 198flaga 171format
base64 63default 149dev 149JSON 117 126 198PNG 63short 149tiny 149tras 166XML 117
formularz 112 117 119 227 266framework
Connect Patrz ConnectExpress Patrz ExpressJavaScript 182Mocha Patrz Mochaprogramowania obiektowego 294SocketIO Patrz socketio
framing Patrz ramkowaniefunkcja 33 34
anonimowa 35argument 34arno 34domkni cie Patrz domkni cieJavaScript 140
obs ugi trasy 166rekurencyjna 75samowywo uj ca 35this 34trycatch 37zwracaj ca funkcj 142zwrotna 93 111
GGitHub 17gniazdo 47 182 200
TCP 73grafika 298Grooveshark 210
Hhandshake Patrz wymiana potwierdzeheader Patrz nag oacutewekheartbeats Patrz taktowanieHTML5 181HTTP 87 105 111 116 121 124 183 260
nag oacutewek Patrz nag oacutewekHTTPS Patrz danie HTTP
Iin-memory store Patrz magazyn pami ciowyinterfejs
2d Canvas 294connect Patrz connectDOM 294Node EventEmitter Patrz Node EventEmitterprogramistyczny 56 57 58 59 62 67 294
adaptacja 296ECMA 296EventEmitter 61 62fs 70ponad interfejsem klienta HTTP 128Stream 82TinySong 210Twittera 124 128udost pnianie 59WebSocket 184wy szego rz du 111
ReadStream 110stdio 70WebSocket 294XMLHttpRequest 294
Internet Protocol Patrz protokoacute IPInternet Relay Chat Patrz IRCIRC 102 103
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SKOROWIDZ
319
319
JJade 172 225 248
instalowanie 313interpolacja 256
JavaScriptkompatybilno c 294konstruktor 236wersja
podstawowa 31 32v8 31 38
j zykSQL 247szablonoacutew 164 172zapyta Redis 275
jQuery 182 262 266JSON 27 117 126 198 250 266
deserializacja 39 169 195serializacja 39 195 199
Kkatalog roboczy 80 84
bie cy 80klasa 35
EventEmitter 96httpServer 87netServer 87pochodna 36Schema 236
klientHTTP 108 121 128IRC 102 103 104SSH 87TCP 102telnet 90Twittera 121
klucz 232 240 274dost powy 125indeks 239kliencki 125Redis 274 277type 237wype nianie automatyczne 241zagnie d ony 238
kodANSI Patrz sekwencja steruj ca ANSIasynchroniczny 311automatyczny 96bajtowy 88 96HTML 108JSON 27 172 250utf-8 96 103 122wspoacute dzielony 294
kolekcja 221kompilator CC++ 23konstruktor 32
httpServerRequest 106httpServerResponse 106JavaScript 236
kontrolaprzeci e 89przep ywu 89
kontroler 164konwencja semver 69Kvalheim Christian Amor 224
Llatency Patrz opoacute nienielicznik 94limit czasowy 89 195 198Linuks
Amazon 23Ubuntu 23
Linux 21lista Redis 279locals object Patrz obiekt zmiennych lokalnychlong polling Patrz odpytywanie wyd u one
Ła cuch
zapytania 118 119 148parsowanie 148
znakoacutew Patrz znak a cuch
Mmagazyn pami ciowy 274mapa
relacji 281tras Patrz trasa mapa
mapowanie obiektowo-dokumentowe Patrz ODMMened er Pakietoacutew Node Patrz NPMmetoda
apply 34
bind 40
call 34
filter 39
forEach 39
isArray 39
keys 38
lastIndexOf 39
reduce 39
reduceRight 39
toString(utf8) 96
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SKOROWIDZ
320
320
metodatrim 39__defineGetter__ 41__defineSetter__ 41addEventListener 61appdisable 171appdisabled 171appenable 171appenabled 171apperror 173appset 166 171assertok 307 308basicAuth 160blokuj ca 46bodyParser 151 154 266clientmulti 284configure 171connect 103consolelog 75cookieParser 153 154 225createClient 250createServer 93 94 103 111 137 149del 129 166DELETE 116 260dispatchEvent 61emit 61expresscreateServer 165findOne 234fscreateReadStream 83fsreaddir 71fswatch 84fswatchFile 84get 166GET 116 126head 129 166HTTP 113 115httprequest 128index 239indexOf 308isDirectory 74join 113JSONparse 39JSONstringify 39listen 94 130logger 148 154methodOverride 160modu u
expectjs 309mongooseconnect 236netStreamsetEncoding 96next 143 168 231nieblokuj ca 46obs ugi zdarzenia 50on 61once 161
patch 166PATCH 116 260post 129 166POST 116po rednicz ca 239po rednicz ca 135 140 141 146 148 153
154 160 166 173do uwierzytelniania 233do czana warunkowo 177kompatybilna z Connect 177konfigurowalna 142przypisanie 147tworzenie 143wielokrotnego u ytku 142
processexit 81processstdoutwrite 75put 129 166PUT 116query 148readFile 82removeEventListener 61removeListener 61render 167 168request 122requestget 128require 172send 129 184sequelizedefine 264session 154 155 225
magazyn 159set 129 165setEncoding 122setTimeout 56 110slice 80static 140 146 147 266
hidden 148maxAge 147
stringify 123updateAttributes 270use 149write 110writeFile 82writeHead 109
dania 116middleware Patrz metoda po rednicz caMocha 310 311 315
instalowanie 313model
definiowanie 264DOM 294 298Mongoose 243obiektowy Redis 276REST Patrz REST
modularno 178
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SKOROWIDZ
321
321
moduassert 298 308bezwzgl dny 57connect-redis 159definiowanie 26ejs 172expectjs 308formidable 151fs 68 70 77 82http 105 136 141instalacja 25natywny 136net 103nieblokuj cy 48querystring 118 119 126search 168sequelize 260superagent 128 129 164 307udost pnianie 295wzgl dny 58zewn trzny 57
MongoDB 221 222 223 235indeksowanie 223instalacja 223wydajno 223
Mongoose 223 236 242model 243
mounting Patrz pod czanie przypisaniemultipleksacja 200MySQL 247
Nnag oacutewek 107 108
Authorization 126Connection 109 112Content-Type 107 110 111 112 117 128Cookie 153Transfer-Encoding 109
najemca 49name 27 40namespace Patrz przestrze nazwnarz dzie
binarne 27browserbuild Patrz browserbuildFirebug Patrz Firebugobs ugi daty 294REPL Patrz REPLtelnet Patrz telnetup 130Web Inspector Patrz Web Inspectorwiersza polece 27
niepodzielno operacji 235Node Package Manager Patrz NPMNodeJS instalacja 21 23
node-mysql 248node-XMLHttpRequest 298nonprinting character Patrz znak niedrukowalnyNoSQL 247notacja z kropk 238NPM 25 26 69 224
instalacja modu u 25rejestr 28
null 33
Oobiekt
b du 71Buffer 63 96console 57Date 294Error 173EventEmitter 73fsWriteStream 83global 56globalny 56httpServerResponse 110JavaScript 111Math 294odpowiedzi 111po czenia 111process 56 82processargv 79processenv 81processEventEmitter 61processstdin 161procesu 56req 141reqsession 156 233Request 173res 141Response 173rozszerzenie 173Schema 237sesji 233Stream 73 94struktura danych 119window 56 61XMLHTTPRequest 61zmiennych lokalnych 168
dania 111Object-Relational Mapper Patrz ORMobserwacja 83 84ODM 223odpowied 106odpytywanie wyd u one 198odwzorowanie obiektowo-relacyjne Patrz ORMoperacja wej cia-wyj cia 47 49 63 73 83
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SKOROWIDZ
322
322
operator~ 308instanceof 32 36typeof 32 33 39
opoacute nienie 187ORM 223 247OS X 21
Pparsowanie 118 128 148 199
r czne 212p tla
wczytaj-wykonaj Patrz REPLzdarze 46 47
PHP 45 46pipe Patrz potokplik
CSS 84deskryptor 47dziennika Patrz dziennikindexjs 92JSON 154packagejson 26 27 58 69 92 102 112
121 139 164 224 236przetwarzany poleceniem node 17statyczny 138 139 141ukryty 148widoku 167wysy anie grupowe 153
pod czanie 179podobiekt 277polecenie
$ npm install 69consolelog 111ensureIndex 232express 28GET 276HEXISTS 276HGETALL 287KEYS 275moduleexport 154node 16 68npm install 112npm publish 26redis-cli 275require 154 224search 28SELECT 258SET 276SMEMBERS 276USER 103view 28
po czenie 88 94 111aktywne 94bezpieczne 125b d 95SSL 125telnet 106
port httplocalhost3000 106potok 47 110potwierdzenie 89 207pow oka 81
systemowa wiersz polece 22proces d ugotrwa y 45program
asynchroniczny 47 70 76pocztowy 87zako czenie 81
programowaniebehawioralne 313obiektowe 294oparte na testach Patrz TDD
projektnazwa 27obiekt zale no ci 27publikacja 27wersja 27
protokoacuteHTTP Patrz HTTPIP 88IRC Patrz IRCpo czeniowy 87TCP Patrz TCPtransportowy 87warstwy dost pu 224WebSocket 184
prototyp 35przeci enie 89przegl darka 56
Chrome Patrz ChromeSafari Patrz Safari
przestrze nazw 199przetwarzanie wsadowe 74przypisanie 147pseudonim 92 96 97 99 103 203
Qquery string Patrz a cuch zapytania
Rramkowanie 184RAW TCP 90Read-Eval-Print Loop Patrz REPL
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SKOROWIDZ
323
323
Redis 158 159 274instalacja 275j zyk zapyta 275opcje utrwalania 274zalety 280
refaktoring 17 68 75refaktoryzacja 243referencja 32rejestr NPM 26 69REPL 17 24REPL Node 23repozytorium GitHub Patrz GitHubrequest Patrz danieresponse Patrz odpowiedREST 260rozg aszanie 195 203 204
SSafari 296sekwencja steruj ca ANSI 82self-invoked functions Patrz funkcja
samowywo uj casequelize 260 263 271
pobieranie danych 268relacja 265usuwanie danych 269
serial execution Patrz przetwarzanie wsadoweserwer
HTTP 111 122HTTP Node 130kod 92proxy 195 198prze adowanie 130Redis 275struktur danych 273TCP 92 111w roacute nych sieciach 121WWW 88 90 106 110
sesji dane 159sesja u ytkownika 154 158 280shared-state concurrency Patrz wspoacute bie no
stanu dzielonegoshimming Patrz adaptacjasie spo eczno ciowa 182 200 222SIGKILL 81signal Patrz sygnasilnik
JavaScriptCore VM 296v8 31 296
skroacutety 150skrypt 24socket Patrz gniazdosocketio 17 197 198 200sortowanie 240
SQL injection SQL wstrzykni cie kodu 257stack trace Patrz stos wywo a ladsterownik 224stos
wykonania Patrz stos wywo awywo a 40 48
lad 40 51strategia organizacji 178strumie
danych 88do odczytu 83 138do zapisu 83 138kodowanie 75stderr 72stdin 72stdout 72wej cia 123wyj cia 71
strumie przetwarzanie potokowe 110styl
BDD 313eksportu 314TDD 314
superagent Patrz modu superagentPatrz modu superagent
sygna SIGKILL 81system
logowania 154plikoacutew 110
dost p asynchroniczny 71dost p synchroniczny 71
szablonoacutew 164szablon 164 225 253
mechanizm 165 167 172 294
Środowisko produkcyjne 171
Ttablica 33 71 113 258
argv 126asocjacyjna 274 277 279asocjacyjna opcji 235ci goacutew znakoacutew 279metody 39
taktowanie 195TCP 87 88 92 106 183TDD 314technologia
AJAX Patrz AJAXWebSocket Patrz WebSocket
telnet 50 89 106 184 275terminal 23
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SKOROWIDZ
324
324
testkodu asynchronicznego 311kodu roacuted owego 305sprawdzaj cy 305tworzenie 306udost pnianie 314
test-driven development Patrz TDDtestowanie automatyczne 305timeout Patrz limit czasowyTinySong 210Transmission Control Protocol Patrz TCPtransport 198 199trasa 166 175 228 248 258 261
definiowanie 226dopasowanie 176format 166kontrola przep ywu 176mapa 178z parametrami 175
trasowanie 171tryb
bezpieczny 235 236bezprotoko owy 90RAW TCP 90
Twitter 121 124 164 306aplikacja 125
typarray 32boolean 32danych 223function 32konwersja 242 260null 32number 32Number 277 294object 32ObjectId 237prosty 32Sequelize 264string 32String 277 294undefined 32z o ony 32
Uu ytkownik 176 250
czatu 97 98 99 100logowanie 154mapa relacji spo ecznych 281obserwacja 283obserwowany 281obserwuj cy 281profil 222pseudonim Patrz pseudonim
sesja Patrz sesja u ytkownikato samo 200uwierzytelnianie 225 233uwierzytelnienie 177znajomy 284
Vversion 27view Patrz widok
Wwarto
330 33null Patrz nullundefined 33
w tek wykonawczy 47 49Web Inspector 17WebSocket 184 195 197 198 294 298websocketio 185 186wersja
numer 147numeracja kontroli 69
White Nathan 223widok 164 167 253wiersz polece 68 79Windows 21wirtualizacja 49w a ciwo
__proto__ 40headers 111length 34name 40 119private 27reqconnection 112url 114
wspoacute bie no 43 47 48 71stanu dzielonego 44 97
wydajno 43 48wyj tek AssertionError 306wymiana potwierdze 184wywo anie
blokuj ce 70nieblokuj ce 70 173wej cia-wyj cia 173zwrotne 44 46 47 51 63 93 94 230 250
XXML 117xmlhttprequest 294XTerm 23
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
SKOROWIDZ
325
325
Zzakres
definiowanie 35wewn trzny 35
zale no 57 69 70 92 139 144 165 224 260config 251express 185 248mysql 251node-mysql 249
zapytanie 240AJAX 198 266SQL 247
zasada DRY 139zbioacuter 279 280
sortowany 280zdarzenie 61 198
close 95 103 195 198connect 103 198connection 199data 62 103delegacja 269disconnect 198emisja 61 62end 62 95 119 122error 50 62 95 252generowanie 198nas uchiwanie 61 62 96 103 198obiektu process 82open 198po czenia 250uncaughtException 50
zmienna_method 160globalna 56 70
exports 57 59module 57 59require 57
licznika Patrz licznikNODE_ENV 81process 70prywatna 35resbody 169rodowiskowa 81
url 116znak
ci g Patrz ci g znakoacutewdiakrytyczny 108a cuch 39
niedrukowalny 82ucieczki 257
Żdanie 106 112
asynchroniczne 182czas odpowiedzi 142 144DELETE 160GET 307HTTP 73 125 126 182kolejno 182PATCH 160POST 182PUT 160
Kup książkę Poleć książkę
NOTATKI
328
328
Kup książkę Poleć książkę
top related