podręcznik node.js. smashing magazine

42

Upload: lenhi

Post on 11-Jan-2017

231 views

Category:

Documents


5 download

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ę

NOTATKI

328

328

Kup książkę Poleć książkę