Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00635 008286 10500692 na godz. na dobę w sumie
Podręcznik Node.js. Smashing Magazine - książka
Podręcznik Node.js. Smashing Magazine - książka
Autor: Liczba stron: 328
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-6674-4 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie mobilne >> android
Porównaj ceny (książka, ebook, audiobook).

Wykorzystaj potencjał Node.js!

Platforma Node.js powstała w 2009 roku. Pozwala na tworzenie wydajnych, skalowalnych aplikacji sieciowych. W tym środowisku napiszesz kod działający po stronie serwera - i użyjesz do tego języka JavaScript. Brzmi niesamowicie? I tak w rzeczywistości jest! Przekonasz się o tym w czasie czytania tej książki. Została ona w całości poświęcona Node.js.

Dzięki temu wspaniałemu podręcznikowi błyskawicznie skonfigurujesz i uruchomisz swoją pierwszą aplikację. Potem będzie już tylko ciekawiej - sterowanie zdarzeniami, wykorzystywanie wydajnych operacji wejścia-wyjścia oraz połączenie z bazą MongoDB to tylko niektóre z poruszanych tematów. Dowiesz się także, jak skorzystać z dostępu do danych w czasie rzeczywistym z pomocą technologii WebSocket oraz jak testować napisany kod z użyciem testów automatycznych. Po lekturze tej książki bez trudu przygotujesz aplikację, która będzie w stanie obsłużyć dziesiątki tysięcy jednoczesnych połączeń na jednym serwerze. Zainteresowany? Sięgnij po książkę - naprawdę warto!

Sprawdź:

Twój klucz do tworzenia wydajnych aplikacji sieciowych!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Smashing Node.js: JavaScript Everywhere Tłumaczenie: Krzysztof Wołowski ISBN: 978-83-246-6674-4 This edition first published 2012 © 2012 Guillermo Rauch All Rights Reserved. Authorised translation from the English language edition published by John Wiley Sons Limited. Responsibility for the accuracy of the translation rests solely with Helion S.A. and is not the responsibility of John Wiley Sons Limited. No part of this book may be reproduced in any form without the written permission of the original copyright holder, John Wiley Sons Limited. Translation copyright © 2014 by Helion S.A. Wiley and the John Wiley Sons, Ltd. logo are trademarks or registered trademarks of John Wiley Sons, Inc. and/or its affiliates in the United States and/or other countries, and may not be used without written permission. All other trademarks are the property of their respective owners. John Wiley 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 kompletne i 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 również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/podnod.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/podnod Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści Część I Szybki start: instalacja i pojęcia ogólne Rozdział 1 Przygotowanie środowiska Instalacja w systemie Windows Instalacja w systemie OS X Instalacja w systemie Linux Kompilacja Kontrola działania Narzędzie REPL Node Wykonanie skryptu NPM Instalowanie modułów Definiowanie własnego modułu Instalacja narzędzi binarnych Przeszukiwanie rejestru NPM Podsumowanie Rozdział 2 Przegląd JavaScript Podstawowy JavaScript Typy Typowa łamigłówka Funkcje Konstrukcje this, call() i apply() Arność funkcji Domknięcia Klasy Dziedziczenie Blok try {} catch {} JavaScript w wersji v8 Metoda keys() obiektu Metoda isArray() tablicy Metody tablic Metody łańcuchów znaków JSON Metoda bind() funkcji Właściwość name funkcji Właściwość __proto__ i dziedziczenie Metody dostępowe Podsumowanie 19 21 22 22 23 23 23 23 24 25 25 26 27 28 29 31 32 32 32 33 34 34 35 35 36 37 38 38 39 39 39 39 40 40 40 41 42 Kup książkęPoleć książkę SPIS TREŚCI Rozdział 3 Blokujące i nieblokujące operacje wejścia-wyjścia Duże możliwości to duża odpowiedzialność Blokowanie Jednowątkowy świat Obsługa błędów Ślady stosów wywołań Podsumowanie Rozdział 4 JavaScript dla Node Obiekt globalny Pożyteczne zmienne globalne System modułów Moduły względne i bezwzględne Udostępnianie interfejsu programistycznego Zdarzenia Bufory Podsumowanie Część II Najistotniejsze interfejsy programistyczne Node Rozdział 5 Wiersz poleceń i moduł FS: Twoja pierwsza aplikacja Wymagania Piszemy nasz pierwszy program 6 Tworzymy moduł sync czy async? Zrozumienie strumieni Wejście i wyjście Refaktoring Interakcja z modułem fs Wiersz poleceń Obiekt argv Katalog roboczy Zmienne środowiskowe Zakańczanie programu Sygnały Sekwencje sterujące ANSI Moduł fs Strumienie Obserwacja Podsumowanie Rozdział 6 Protokół TCP Czym charakteryzuje się TCP? Komunikacja z naciskiem na połączenia i zasada zachowania kolejności Kod bajtowy jako podstawowa reprezentacja Niezawodność Kontrola przepływu Kontrola przeciążeń 43 44 46 47 50 51 53 55 56 56 57 57 59 61 63 64 65 67 68 68 69 70 71 73 75 77 79 79 80 81 81 82 82 82 83 84 84 87 88 88 88 89 89 89 Kup książkęPoleć książkę Telnet Czat na bazie TCP Tworzymy moduł Klasa net.Server Odbieranie połączeń Zdarzenie data Stan i monitorowanie połączeń Wykończenie Klient IRC Tworzymy moduł Interfejs net.Stream Implementacja części protokołu IRC Test z prawdziwym serwerem IRC Podsumowanie Protokół HTTP Struktura HTTP Nagłówki Połączenia Prosty serwer WWW Tworzymy moduł Wyświetlamy formularz Metody i adresy URL Dane Składamy elementy w całość Dopracowanie szczegółów Klient Twittera Rozdział 7 Tworzymy moduł Wysyłanie prostego żądania HTTP Wysłanie danych Pobieranie tweetów Moduł superagent na pomoc Przeładowanie serwera za pomocą narzędzia up Podsumowanie Część III Tworzenie aplikacji sieciowych Rozdział 8 Framework Connect Prosta strona internetowa przy użyciu modułu http Prosta strona internetowa przy użyciu frameworka Connect Metody pośredniczące Tworzenie metod pośredniczących wielokrotnego użytku Metoda pośrednicząca static Metoda pośrednicząca query Metoda pośrednicząca logger Metoda pośrednicząca bodyParser Ciasteczka Metoda pośrednicząca session SPIS TREŚCI 7 89 92 92 92 94 96 97 100 102 102 103 103 104 104 105 106 107 111 112 112 112 114 117 119 120 121 121 122 123 124 128 130 130 133 135 136 139 141 142 146 148 148 150 153 154 Kup książkęPoleć książkę SPIS TREŚCI Sesje Redis Metoda pośrednicząca methodOverride Metoda pośrednicząca basicAuth Podsumowanie Rozdział 9 Framework Express Prosta aplikacja Express Tworzymy moduł HTML Konfiguracja Definiowanie tras Moduł search Uruchomienie aplikacji Ustawienia Mechanizmy szablonów Obsługa błędów Metody złożone Trasy Metody pośredniczące Strategie organizacji Podsumowanie 8 Rozdział 10 Technologia WebSocket AJAX Technologia WebSocket Aplikacja Echo Przygotowanie Konfiguracja serwera Konfiguracja klienta Uruchomienie serwera Kursory myszy Przygotowanie Konfiguracja serwera Konfiguracja klienta Uruchomienie serwera Kwestie do rozwiązania Zamknięcie połączenia a rozłączenie JSON Ponowne łączenie Rozgłaszanie WebSocket to HTML5: starsze przeglądarki go nie obsługują Rozwiązanie Podsumowanie Rozdział 11 Framework Socket.IO Transporty Rozłączenie kontra zamknięcie połączenia Zdarzenia Przestrzenie nazw 159 160 160 162 163 164 164 164 165 166 168 169 170 172 173 173 175 177 178 180 181 182 184 185 185 186 187 188 189 189 189 192 194 194 195 195 195 195 195 195 196 197 198 198 198 199 Kup książkęPoleć książkę Czat Przygotowanie programu Konfiguracja serwera Konfiguracja klienta Zdarzenia i rozgłaszanie Gwarancja odbioru Aplikacja DJ Rozszerzenie czata Integracja z interfejsem Grooveshark Odtwarzanie Podsumowanie Część IV Bazy danych Rozdział 12 MongoDB Instalacja Dostęp do MongoDB: przykład uwierzytelnienia użytkownika Konfiguracja aplikacji Tworzymy aplikację Express Łączymy się z MongoDB Tworzymy dokumenty Wyszukiwanie dokumentów Metoda pośrednicząca do uwierzytelniania Sprawdzanie poprawności danych Niepodzielność Tryb bezpieczny Wprowadzenie do Mongoose Definiowanie modelu Definiowanie zagnieżdżonych kluczy Definiowanie zagnieżdżonych dokumentów Ustawianie indeksów Metody pośredniczące Sprawdzanie stanu modelu Zapytania Rozszerzanie zapytań Sortowanie Wybieranie danych Limitowanie wyników Pomijanie wyników Automatyczne wypełnianie kluczy Konwersja typów Przykład Mongoose Konfiguracja aplikacji Refaktoryzacja Definiowanie modeli Podsumowanie SPIS TREŚCI 200 200 200 201 203 207 209 209 210 213 218 219 221 223 224 224 224 228 230 232 233 234 235 235 236 236 238 238 239 239 239 240 240 240 240 241 241 241 242 242 242 243 243 245 9 Kup książkęPoleć książkę SPIS TREŚCI Rozdział 13 MySQL node-mysql Konfiguracja Aplikacja Express Łączenie z MySQL Inicjalizacja skryptu Wstawianie danych Pobieranie danych Narzędzie Sequelize Konfiguracja Sequelize Konfiguracja aplikacji Express Konfiguracja Sequelize Definiowanie modeli i synchronizacja Wstawianie danych Pobieranie danych Usuwanie danych Wykończenie Podsumowanie 10 Rozdział 14 Redis Instalacja Redis Język zapytań Redis Typy danych Ciągi znaków Tablice asocjacyjne Listy Zbiory Zbiory sortowane Redis i Node Implementacja mapy relacji przy użyciu Node i Redis Podsumowanie Część V Testowanie Rozdział 15 Współdzielony kod Co może być współdzielone? Kompatybilność kodu JavaScript Udostępnianie modułów Adaptacja interfejsów programistycznych ECMA Adaptacja interfejsów programistycznych Node Adaptacja interfejsów programistycznych przeglądarek Dziedziczenie dla wszystkich przeglądarek Zastosowanie praktyczne: narzędzie browserbuild Prosty przykład Podsumowanie 247 248 248 248 249 250 253 258 259 260 260 263 264 266 268 269 271 272 273 275 275 276 277 277 279 279 280 280 281 290 291 293 294 294 295 296 297 298 298 299 300 302 Kup książkęPoleć książkę Rozdział 16 Testowanie Proste testy Przedmiot testów Strategia testów Program testowy Expect.js Przegląd interfejsów programistycznych Mocha Testowanie asynchronicznego kodu Styl BDD Styl TDD Styl eksportu Korzystanie z Mocha w przeglądarce Podsumowanie Skorowidz SPIS TREŚCI 305 306 306 306 307 308 308 310 311 313 314 314 315 316 317 11 Kup książkęPoleć książkę Kup książkęPoleć książkę PODRĘCZNIK NODE.JS 5 I Ł A Z D Z O R WIERSZ POLECEŃ I MODUŁ FS: TWOJA PIERWSZA APLIKACJA W TYM ROZDZIALE ZAJMIEMY SIĘ jednymi z najważniejszych interfejsów programistycznych Node.JS: interfejsami związanymi z obsługą strumienia wejściowego (stdin) i wyjściowego (stdout) procesu oraz interfejsami związanymi z systemem plików (moduł fs). Jak już wiemy z poprzedniego rozdziału, kluczowe w sposobie obsługi współbieżności przez Node jest użycie wywołań zwrotnych i zdarzeń. Dzięki tym interfejsom poznasz kontrolę przepływu w procesie programowania z wykorzystaniem zdarzeń i nieblokujących operacji wejścia-wyjścia. Wiedzę na temat tych interfejsów i ich interakcji sprawdzisz, tworząc swoją pierwszą aplikację: prosty, uruchamiany z wiersza poleceń eksplorator plików, który umożliwi użytkownikowi tworzenie nowych oraz odczyt zawartości istniejących plików. Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE WYMAGANIA Na początek określ, jakie zadania powinien wykonywać program: (cid:31) Chcesz, żeby program uruchamiany był z wiersza poleceń. Oznacza to, że będzie uruchamiany albo za pomocą polecenia node, albo bezpośrednio, a dalsza interakcja z użytkownikiem będzie się odbywać przez terminal. (cid:31) Po uruchomieniu program powinien wyświetlić listę bieżących katalogów (zob. rysunek 5.1). 68 Rysunek 5.1. Lista bieżących katalogów wyświetlana przy starcie programu (cid:31) Po wybraniu pliku program powinien wyświetlić jego zawartość. (cid:31) Po wybraniu katalogu program powinien wyświetlić jego podkatalogi. (cid:31) Następnie program powinien się zakończyć. Biorąc pod uwagę powyższe, projekt można rozbić na kilka mniejszych etapów: 1. Utworzenie naszego modułu. 2. Wybranie synchronicznej lub asynchronicznej wersji modułu fs. 3. Zrozumienie strumieni. 4. Przeprowadzenie operacji wejścia i wyjścia. 5. Refaktoring. 6. Interakcja z modułem fs. 7. Dopracowanie szczegółów. PISZEMY NASZ PIERWSZY PROGRAM Zbudujesz teraz moduł na bazie wymienionych powyżej kroków. Moduł będzie złożony z kilku plików, które utworzysz za pomocą dowolnego edytora tekstu. Pod koniec tego rozdziału będziesz dysponować w pełni funkcjonalnym programem, napisanym w całości w Node.JS. Kup książkęPoleć książkę ROZDZIAŁ 5: WIERSZ POLECEŃ I MODUŁ FS: TWOJA PIERWSZA APLIKACJA TWORZYMY MODUŁ Jak w każdym przykładzie w tej książce, zaczniemy od utworzenia katalogu zawierającego nasz projekt. Na potrzeby przykładu nazwiemy go file-explorer. W poprzednich rozdziałach wspomnieliśmy o dobrej praktyce definiowania pliku package.json dla każdego projektu. Zachowujesz w ten sposób kontrolę nad zależnościami określonymi w rejestrze NPM i możliwość publikacji modułów w przyszłości. Chociaż w naszym przykładzie będziemy korzystać tylko z wbudowanych modułów Node (a więc niepobieranych z rejestru NPM), musimy przygotować prosty plik package.json: package.json { name : file-explorer , version : 0.0.1 , description : Eksplorator plików w wierszu polece(cid:241)! } Uwaga: NPM wprowadza numerację kontroli wersji według tzw. konwencji semver. To dlatego zamiast „0.1” lub „1” w polu version podajemy wartość „0.0.1”. 69 Aby zweryfikować poprawność pliku package.json, wydaj polecenie $ npm install. Jeżeli wszystko działa, nie powinny zostać wyświetlone żadne błędy1. W innym razie pojawi się wyjątek JSON (zob. rysunek 5.2). Rysunek 5.2. Uruchomienie polecenia npm install z niepoprawnym kodem JSON w pliku package.json W następnej kolejności utworzysz plik JavaScript index.js, który będzie zawierał podstawowy kod programu. 1 Aczkolwiek mogą zostać wyświetlone ostrzeżenia — przyp. tłum. Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE SYNC CZY ASYNC? Na 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: index.js /** * Zale(cid:298)no(cid:286)ci modu(cid:225)u. */ var fs = require( fs ); Pierwszym zadaniem po uruchomieniu programu będzie uzyskanie listy plików w bieżącym katalogu. Musisz przy tym pamiętać, że interfejs programistyczny fs jest wyjątkowy w tym sensie, że pozwala zarówno na blokujące, jak i nieblokujące wywołania. Jeśli na przykład chcesz pobrać listę istniejących katalogów, możesz to zrobić w następujący sposób: console.log(require( fs ).readdirSync(__dirname)); Wywołanie zwróci zawartość natychmiast lub wygeneruje wyjątek w przypadku błędu (zob. rysunek 5.3). 70 Rysunek 5.3. Sprawdzanie wartości readdirSync Innym podejściem jest rozwiązanie asynchroniczne: function async (err, files) { console.log(files); }; require( fs ).readdir( . , async); Da ono identyczne wyniki, pokazane na rysunku 5.4. Rysunek 5.4. Asynchroniczna wersja readdir Kup książkęPoleć książkę ROZDZIAŁ 5: WIERSZ POLECEŃ I MODUŁ FS: TWOJA PIERWSZA APLIKACJA Z rozdziału 3. wiemy, że aby nasze aplikacje były szybkie i radziły sobie z obsługą współbieżności w 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 jedno z najważniejszych i najtrudniejszych zagadnień związanych z Node.JS, zastosujesz rozwiązanie asynchroniczne. Do uzyskania listy plików wykorzystamy zatem metodę fs.readdir. Przekazywane wywołanie zwrotne dostarcza obiekt błędu (który ma wartość null w przypadku braku błędu) i tablicę files: index.js // . . . fs.readdir(__dirname, function (err, files) { console.log(files); }); Spróbuj wywołać program! Otrzymany rezultat powinien być podobny do tego z rysunku 5.5. 71 Rysunek 5.5. Twój pierwszy program w akcji Teraz, kiedy już wiesz, że moduł fs zawiera zarówno synchroniczne, jak i asynchroniczne metody dostępu do systemu plików, musisz jeszcze poznać fundamentalne dla Node.JS pojęcie, jakim są strumienie. ZROZUMIENIE STRUMIENI Jak prawdopodobnie zauważyłeś, metoda console.log wyświetla dane w konsoli. A uściślając, console.log wykonuje konkretne zadanie: zapisuje do strumienia wyjścia stdout podany przez użytkownika łańcuch znaków wraz ze znakiem nowego wiersza \n. Zwróć uwagę na różnicę w wyświetlaniu na rysunku 5.6. A teraz spójrz na kod źródłowy: example-1.js console.log( Witaj (cid:258)wiecie ); Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE Rysunek 5.6. W pierwszym przykładzie po „Witaj świecie” następuje znak nowego wiersza, w drugim już nie oraz example-2.js process.stdout.write( Witaj (cid:258)wiecie ); Globalna zmienna procesu zawiera trzy obiekty Stream, odpowiadające trzem standardowym strumieniom w systemie Unix: - **stdin**: Standard input - **stdout**: Standard output - **stderr**: Standard error Rolę tych obiektów zilustrowano na rysunku 5.7. 72 Rysunek 5.7. 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 po uruchomieniu program wykonuje pewne zadania, po czym kończy działanie. Czasami jednak, i tak jest również w naszej aplikacji, program oczekuje na dane i przynajmniej dopóki nie zostaną one wprowadzone przez użytkownika, nie może zakończyć działania. Kiedy wznawiasz ten strumień (za pomocą metody resume), Node obserwuje odpowiedni deskryptor pliku (który w systemie Unix otrzymuje numer 0) i przy ciągłym działaniu pętli zdarzeń nie kończy programu, czekając na wywołanie zdarzeń. Node.JS zawsze kończy działanie automatycznie, 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 Inną ciekawą własnością obiektu Stream jest to, że posiada on domyślne kodowanie. Jeśli ustawisz 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 aplikacji w Node, podobnie jak obiekt EventEmitter (po którym zresztą dziedziczy). Podczas pracy z Node często będziesz się spotykać z różnego rodzaju strumieniami, takimi jak gniazda TCP czy żądania HTTP. W skrócie, wszędzie tam, gdzie mamy do czynienia ze stopniowym odczytem lub zapisem danych, obecne są strumienie. WEJŚCIE I WYJŚCIE Teraz, kiedy masz już pewne pojęcie o tym, co dzieje się po uruchomieniu programu, możesz przystąpić do tworzenia pierwszej części aplikacji. Wyświetli ona listę plików w bieżącym katalogu i poczeka na dane wprowadzane przez użytkownika: index.js // . . . fs.readdir(process.cwd(), function (err, files) { console.log( ); if (!files.length) { return console.log( \033[31m Brak plików do wy(cid:258)wietlenia!\033[39m\n ); } 73 console.log( Wybierz plik lub katalog, który chcesz zobaczy(cid:202)\n ); function file(i) { var filename = files[i]; fs.stat(__dirname + / + filename, function (err, stat) { if (stat.isDirectory()) { console.log( +i+ \033[36m + filename + /\033[39m ); } else { console.log( +i+ \033[90m + filename + \033[39m ); } i++; if (i == files.length) { console.log( ); process.stdout.write( \033[33mWprowad(cid:283) swój wybór: \033[39m ); process.stdin.resume(); } else { file(i); } }); } file(0); }); Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE Przeanalizujmy ten kod wiersz po wierszu. Aby zwiększyć przejrzystość tekstu, wstawiamy pusty wiersz: console.log( ) Następnie dodajemy komunikat o braku plików do wyświetlenia, jeśli tablica plików jest pusta. Łańcuchy \033[31m i 033[39m, otaczające tekst, nadają mu czerwony kolor. Na końcu znajduje się znak nowego wiersza \n, służący do wizualnego rozdzielenia tekstu. if (!files.length) { return console.log( \033[31m Brak plików do wy(cid:258)wietlenia!\033[39m\n ); } Kolejnego wiersza nie trzeba objaśniać: console.log( Select which file or directory you want to see\n ); Definiujemy funkcję, która będzie wywołana dla każdego elementu tablicy. Jest to pierwszy ze wzorców asynchronicznej kontroli przepływu używanych w tej książce: przetwarzanie wsadowe (ang. serial execution). Pod koniec rozdziału zajmiemy się nim bardziej szczegółowo. 74 function file (i) { // . . . } Uzyskujemy dostęp do pierwszej nazwy pliku i pobieramy informacje o pliku w postaci obiektu Stat. Obiekt fs.stat dostarcza nam różne metadane pliku lub katalogu: var filename = files[i]; fs.stat(__dirname + / + filename, function (err, stat) { // . . . }); Funkcja zwrotna dostarcza nam obiekt błędu (o ile taki się pojawi) oraz obiekt Stat. W tym przypadku interesuje nas metoda isDirectory tego ostatniego: if (stat.isDirectory()) { console.log( +i+ \033[36m + filename + /\033[39m ); } else { console.log( +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 jeden, bezpoś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 i++; if (i == files.length) { console.log( ); process.stdout.write( \033[33mWprowad(cid:283) swój wybór: \033[39m ); process.stdin.resume(); process.stdin.setEncoding( utf8 ); } else { file(i); } Jeżeli nie ma już więcej plików, użytkownik proszony jest o wybór opcji. Zauważ, że posługujemy się tu metodą process.stdout.write zamiast console.log; nie chcemy przenosić kursora do nowego wiersza, użytkownik wprowadza swój wybór bezpośrednio po komunikacie (zob. rysunek 5.8): console.log( ); process.stdout.write( \033[33mWprowad(cid:283) swój wybór: \033[39m ); 75 Rysunek 5.8. Aktualna wersja programu prosi o wprowadzenie danych wejściowych Jak już wiesz, poniższy wiersz pozwala na pobranie danych od użytkownika: process.stdin.resume(); W tym wierszu ustawiamy kodowanie strumienia na wartość utf-8, zapewniając obsługę znaków specjalnych i diakrytycznych: process.stdin.setEncoding( utf8 ); Jeśli są jeszcze pliki do przetworzenia, nasza funkcja zostaje wywołana w sposób rekurencyjny ponownie: file(i); Proces jest kontynuowany, dopóki wszystkie pliki nie zostaną przetworzone, po czym użytkownik proszony jest o wprowadzenie danych. Tym sposobem najważniejsza część aplikacji jest już prawie gotowa. REFAKTORING Refaktoring zaczniemy od dodania przydatnych skrótów, jako że stdin i stdout będą przez nas używane stosunkowo często. Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE index.js // . . . var fs = require( fs ) , stdin = process.stdin , stdout = process.stdout Ponieważ kod jest asynchroniczny, ryzykujemy, że wraz z rozbudową programu (szczególnie jeśli będzie związana z kontrolą przepływu) zbyt głębokie zagnieżdżenie funkcji zmniejszy czytelność kodu. Aby temu zapobiec, możesz oddzielnie zdefiniować funkcje reprezentujące poszczególne etapy asynchronicznego procesu. Na początek wyodrębnij funkcję odczytującą stdin: index.js // wywo(cid:225)ywana dla ka(cid:298)dego pliku w katalogu function file(i) { var filename = files[i]; 76 fs.stat(__dirname + / + filename, function (err, stat) { if (stat.isDirectory()) { console.log( +i+ \033[36m + filename + /\033[39m ); } else { console.log( +i+ \033[90m + filename + \033[39m ); } if (++i == files.length) { read(); } else { file(i); } }); } // odczytaj dane u(cid:298)ytkownika po wy(cid:286)wietleniu plików function read () { console.log( ); stdout.write( \033[33mWprowad(cid:283) swój wybór: \033[39m ); stdin.resume(); stdin.setEncoding( utf8 ); } Zwróć uwagę, że wykorzystujesz również nowe zmienne pomocnicze stdin i stdout. Po odczytaniu danych następnym logicznym krokiem jest ich przetworzenie. Użytkownik jest proszony o wybranie pliku, który ma zostać odczytany. Po ustawieniu kodowania dla strumienia stdin, zaczynamy nasłuchiwać zdarzenia data: Kup książkęPoleć książkę ROZDZIAŁ 5: WIERSZ POLECEŃ I MODUŁ FS: TWOJA PIERWSZA APLIKACJA function read () { // . . . stdin.on( data , option); } // wywo(cid:225)ywana z opcj(cid:261) wybran(cid:261) przez u(cid:298)ytkownika function option (data) { if (!files[Number(data)]) { stdout.write( \033[31mWprowad(cid:283) swój wybór: \033[39m ); } else { stdin.pause(); } } Sprawdzamy tutaj, czy istnieje indeks tablicy files odpowiadający wyborowi użytkownika. Pamiętaj, że tablica files jest częścią wywołania zwrotnego (fs.readdir), w obrębie którego cały czas się znajdujesz. Zwróć też uwagę na konwersję łańcucha utf-8 data do typu Number przed dokonaniem sprawdzenia. Jeżeli indeks tablicy istnieje, strumień musi zostać ponownie wstrzymany (wracając do stanu domyślnego), aby — po wykonaniu operacji fs, opisanych w kolejnym kroku — program mógł zakończyć działanie (zob. rysunek 5.9). 77 Rysunek 5.9. Przykład źle wprowadzonego wyboru Teraz, kiedy nasz program jest już zdolny do interakcji z użytkownikiem, prezentując mu listę plików do wyboru, możemy zająć się ich odczytem i wyświetleniem. INTERAKCJA Z MODUŁEM FS Kod odpowiedzialny za odszukiwanie plików jest gotowy, czas zatem na ich odczyt! function option (data) { var filename = files[Number(data)]; if (!filename) { stdout.write( \033[31mWprowad(cid:283) swój wybór: \033[39m ); } else { stdin.pause(); fs.readFile(__dirname + / + filename, utf8 , function (err, data) { console.log( ); Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE console.log( \033[90m + data.replace(/(.*)/g, $1 ) + \033[39m ); }); } } Zauważ, że również tym razem możesz określić kodowanie z góry, otrzymując gotowy do użycia łańcuch tekstowy: fs.readFile(__dirname + / + filename, utf8 , function (err, data) { Zawartość data odczytywana jest za pomocą wyrażenia regularnego (zob. rysunek 5.10): data.replace(/(.*)/g, $1 ) 78 Rysunek 5.10. Przykład odczytu prostego pliku Co jeśli użytkownik wybrał katalog? W takiej sytuacji muszą zostać wyświetlone podkatalogi i pliki, które zawiera. Aby uniknąć wielokrotnego wywoływania fs.stat, wróć do funkcji file i dodaj instrukcję zapisującą odwołania do obiektów Stats: // . . . var stats = []; function file(i) { var filename = files[i]; fs.stat(__dirname + / + filename, function (err, stat) { stats[i] = stat; // . . . Teraz możesz sprawdzić, czy użytkownik wybrał katalog w funkcji option. W miejscu, w którym wcześniej znajdowało się wywołanie fs.readFile, wstaw: Kup książkęPoleć książkę ROZDZIAŁ 5: WIERSZ POLECEŃ I MODUŁ FS: TWOJA PIERWSZA APLIKACJA if (stats[Number(data)].isDirectory()) { fs.readdir(__dirname + / + filename, function (err, files) { console.log( ); console.log( (plików: + files.length + ) ); files.forEach(function (file) { console.log( - + file); }); console.log( ); }); } else { fs.readFile(__dirname + / + filename, utf8 , function (err, data) { console.log( ); console.log( \033[90m + data.replace(/(.*)/g, $1 ) + \033[39m ); }); } Jeśli uruchomisz teraz program, po wybraniu katalogu zobaczysz listę plików, które mogą zostać odczytane, do wyboru (zob. rysunek 5.11). 79 Rysunek 5.11. Przykład odczytu katalogu /test I to już wszystko! Właśnie napisałeś swój pierwszy program wiersza poleceń w Node. WIERSZ POLECEŃ Masz już za sobą pierwszy program wiersza poleceń, warto zatem poznać kolejne interfejsy programistyczne, pomocne w tworzeniu podobnych aplikacji, uruchamianych w terminalu. OBIEKT ARGV Obiekt process.argv zawiera wartości wszystkich argumentów, z jakimi program Node został uruchomiony: Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE example.js console.log(process.argv); Na rysunku 5.12 widzimy, że pierwszym elementem jest zawsze node, a drugim ścieżka do uruchamianego pliku. Kolejne elementy są argumentami podanymi w poleceniu. Rysunek 5.12. Przykładowa zawartość process.argv Aby pominąć pierwsze dwa elementy, użyj metody slice (zob. rysunek 5.13): example-2.js console.log(process.argv.slice(2)); 80 Rysunek 5.13. 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 różnicy pomiędzy katalogiem, w którym program rezyduje, a katalogiem, w którym jest uruchamiany. KATALOG ROBOCZY W przykładowej aplikacji z tego rozdziału za pomocą stałej __dirname odwołujesz się do katalogu, w którym znajduje się w systemie plików uruchamiany plik. Czasami jednak w trakcie pracy aplikacji bardziej korzystne jest pobranie nazwy bieżącego katalogu roboczego (ang. current working directory). Zgodnie z aktualną implementacją, niezależnie od tego, czy znajdujesz się w katalogu macierzystym, czy w dowolnym innym katalogu, uruchomienie aplikacji da taki sam wynik. Położenie pliku index.js się nie zmienia, a więc wartość __dirname też pozostaje taka sama. Aby uzyskać bieżący katalog roboczy, wywołaj metodę process.cwd: process.cwd() /Users/guillermo Kup książkęPoleć książkę ROZDZIAŁ 5: WIERSZ POLECEŃ I MODUŁ FS: TWOJA PIERWSZA APLIKACJA Node umożliwia również jego zmianę, dzięki metodzie process.chdir: process.cwd() /Users/guillermo process.chdir( / ) process.cwd() / Kolejny aspekt kontekstu, w którym uruchamiany jest program, to obecność zmiennych środowiskowych. W następnym punkcie pokażemy, jak uzyskać dostęp do tych zmiennych. ZMIENNE ŚRODOWISKOWE Node pozwala na łatwy dostęp do zmiennych, które są częścią środowiska powłoki, poprzez wygodny obiekt process.env. Przykładem popularnej zmiennej środowiskowej jest NODE_ENV (zob. rysunek 5.14), której najczęstszym zastosowaniem jest informowanie programu Node, czy działa w środowisku produkcyjnym, czy deweloperskim. 81 Rysunek 5.14. Zmienna środowiskowa NODE_ENV W trakcie działania programu często potrzebna jest bezpośrednia kontrola nad jego zakończeniem. ZAKAŃCZANIE PROGRAMU Aby zakończyć aplikację, możesz użyć metody process.exit z opcjonalnym kodem zakończenia. Jeśli na przykład chcemy, aby program zakończył się błędem, najlepiej użyć kodu 1. console.error( Wyst(cid:200)pi(cid:239) b(cid:239)(cid:200)d ); process.exit(1); Pozwala to na sprawną współpracę pomiędzy programami wiersza poleceń i innymi narzędziami w systemie operacyjnym. Innym ważnym aspektem tej współpracy są sygnały procesu. Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE SYGNAŁY Proces komunikuje się z systemem operacyjnym na różne sposoby. Jednym z nich są sygnały (ang. signals). Kiedy chcemy na przykład natychmiastowo zakończyć proces, wystarczy mu wysłać sygnał SIGKILL. Sygnały są w Node emitowane jako zdarzenia obiektu process: process.on( SIGKILL , function () { // signal received }); W następnym punkcie wyjaśnimy, jak uzyskaliśmy w naszej przykładowej aplikacji kolorowy tekst. SEKWENCJE STERUJĄCE ANSI Chcąc kontrolować kolory i inne parametry strumienia wyjściowego w terminalu tekstowym, korzystamy z sekwencji sterujących ANSI (ang. ANSI escape sequences), zwanych również kodami ANSI. Te znaki specjalne są rozpoznawane przez emulator terminala w standardowy sposób. 82 Kiedy umieszczasz między tymi znakami tekst, nie pojawią się one oczywiście na ekranie. Są to tak zwane znaki niedrukowalne (ang. nonprinting characters). Weźmy na przykład następujące sekwencje: console.log( \033[90m + data.replace(/(.*)/g, $1 ) + \033[39m ); (cid:31) \033 rozpoczyna sekwencję sterującą; (cid:31) [ informuje o zmianie koloru; (cid:31) 90 zmienia kolor tekstu na jasnoszary; (cid:31) m kończy sekwencję. Zwróć uwagę, że w drugiej sekwencji używamy wartości 39, która powoduje powrót dalszego tekstu do domyślnego dla terminala koloru. Kompletną tabelę kodów ANSI znajdziesz pod adresem http://en.wikipedia.org/wiki/ANSI_ escape_code. MODUŁ FS Moduł fs umożliwia odczyt i zapis danych poprzez interfejs programistyczny Stream. W przeciwieństwie do metod readFile i writeFile, przydział pamięci odbywa się w jego przypadku stopniowo. Kup książkęPoleć książkę ROZDZIAŁ 5: WIERSZ POLECEŃ I MODUŁ FS: TWOJA PIERWSZA APLIKACJA Wyobraź sobie plik z dużą ilością danych oddzielonych przecinkami i milionami wierszy. Jednorazowy jego odczyt w celu przetworzenia wiązałby się z koniecznością przydzielenia dużego obszaru pamięci. Dużo lepszym rozwiązaniem byłby odczyt pliku partiami wyznaczanymi przez znaki końca wiersza („\n”) i ich przetwarzanie na bieżąco. Strumienie Node nadają się do tego idealnie, o czym przekonasz się już zaraz. STRUMIENIE Metoda fs.createReadStream pozwala utworzyć strumień do odczytu (ang. readable) dla danego pliku. Potencjał strumieni najlepiej ilustruje różnica pomiędzy dwoma zamieszczonymi niżej przykładami: fs.readFile( my-file.txt , function (err, contents){ // zrób co(cid:286) z plikiem }); W tym przypadku wywołanie przekazywanej funkcji zwrotnej następuje dopiero, kiedy cała zawartość 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 rozmiarze. Funkcja zwrotna wywoływana jest przy odczycie każdej partii: 83 var stream = fs.createReadStream( my-file.txt ); stream.on( data , function(chunk){ // zrób co(cid:286) z cz(cid:266)(cid:286)ci(cid:261) pliku }); stream.on( end , function(chunk){ // osi(cid:261)gni(cid:266)to koniec pliku }); Dlaczego ta zdolność strumieni jest taka ważna? Wyobraź sobie, że musisz przesłać do usługi sieciowej bardzo duży plik wideo. Wczytanie całego pliku nie jest konieczne do rozpoczęcia przesył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 strumienia do zapisu (ang. writable). Jeżeli używasz aplikacji sieciowej do zapisywania działań użytkowników odwiedzających Twoją stronę w pliku dziennika, zmuszanie systemu operacyjnego do każdorazowego otwarcia i zamknięcia pliku (a co za tym idzie, odszukania go na dysku) nie będzie rozwiązaniem efektywnym z racji dużej liczby zapisywanych zdarzeń. W takim przypadku dużo lepiej użyć obiektu fs.WriteStream, otwierając plik raz, a następnie wywołując metodę .write przy każdym nowym wpisie. Kolejnym ważnym elementem modelu pracy Node, polegającego na nieblokowaniu operacji wejścia-wyjścia, jest obserwacja. Kup książkęPoleć książkę CZĘŚĆ II: NAJISTOTNIEJSZE INTERFEJSY PROGRAMISTYCZNE NODE OBSERWACJA Node umożliwia obserwowanie plików i katalogów pod kątem zmian. Obserwując dany plik lub katalog, jesteśmy informowani (przez zdarzenie w postaci wywołania zwrotnego) o każdej modyfikacji pliku (lub plików zawartych w katalogu). Mechanizm ten jest często wykorzystywany w środowisku Node. Niektórzy wolą na przykład przygotowywać arkusze stylów CSS w sposób pośredni. Wprowadzają oni kod w języku programowania, który jest następnie kompilowany do postaci CSS. Automatyczna kompilacja po każdej modyfikacji pliku jest bardzo wygodna. Rozważmy następujący przykład. Na początek szukamy wszystkich plików CSS w katalogu roboczym, a następnie obserwujemy je pod kątem zmian. Po wykryciu zmiany plik jest wyświetlany w konsoli: var fs = require( fs ); var stream = fs.createReadStream( my-file.txt ); // pobierz wszystkie pliki z katalogu roboczego var files = fs.readdirSync(process.cwd()); files.forEach(function (file) { // obserwuj plik, je(cid:286)li ko(cid:276)czy si(cid:266) .css if (/\.css/.test(file)) { fs.watchFile(process.cwd() + / + file, function () { console.log( – + file + zmieniony! ); }); } }); 84 Oprócz metody fs.watchFile możesz również skorzystać z metody fs.watch, która pozwala na obserwację całych katalogów. PODSUMOWANIE W tym rozdziale poznałeś podstawy tworzenia aplikacji w Node.JS, a dokładniej programu wiersza poleceń, który komunikował się z systemem plików. Chociaż ten konkretny program mógł zostać napisany przy użyciu synchronicznych interfejsów modułu fs, skorzystaliśmy z interfejsów asynchronicznych, aby lepiej zrozumieć pewne niuanse tworzenia kodu z dużą liczbą wywołań zwrotnych. Niezależnie od tego udało nam się uzyskać opisowy i w pełni funkcjonalny kod. Omówiony w tym rozdziale jeden z najważniejszych interfejsów programistycznych, Stream, będzie się często przewijał w dalszej części książki. Prawie wszędzie tam, gdzie mamy do czynienia z 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 Otrzymałeś też dużo wskazówek i narzędzi, dzięki którym jesteś w stanie pisać złożone i przydatne programy, wykorzystujące system plików, komunikujące się z innymi aplikacjami i pobierające dane od użytkownika. Jako programista Node.JS, będziesz tę wiedzę (a szczególnie jej część odnoszącą się do procesu) wykorzystywać bardzo często, zarówno podczas tworzenia aplikacji sieciowych, jak i podczas rozwiązywania bardziej złożonych problemów. Postaraj się ją zatem dobrze przyswoić! 85 Kup książkęPoleć książkę Kup książkęPoleć książkę Skorowidz A C acknowledgment, Patrz: potwierdzenie adaptacja, 294 adres permalink, 176 URL, 44, 113, 114, 115, 116, 120, 126, 137, 139, 147 kodowanie, 118 (cid:225)a(cid:276)cuch zapytania, Patrz: (cid:225)a(cid:276)cuch zapytania uko(cid:286)nik, 171 AJAX, 182, 198, 260, 262 ANSI escape sequences, Patrz: sekwencja steruj(cid:261)ca ANSI arkusz stylów CSS, Patrz: CSS assertion, Patrz: test sprawdzaj(cid:261)cy atomicity, Patrz: niepodzielno(cid:286)(cid:252) operacji autoryzacja, 141, 161 AWS, Patrz: chmura Amazon B baza danych, Patrz te(cid:298): sprawdzanie poprawno(cid:286)ci bezschematowa, 221 MySQL, 258 oparta na dokumentach, 221 pojedyncza, 236 Redis, Patrz: Redis SQL, 250 BDD, 313 behavior-driven development, Patrz: BDD biblioteka jQuery, Patrz: jQuery kryptograficzna, 294 matematyczna, 294 OpenSSL, 23 blog, 235, 238 b(cid:225)(cid:261)d, 50, 81, 168, 173, 231, 252, 306 funkcji od(cid:225)o(cid:298)onej w czasie, 52 po(cid:225)(cid:261)czenia, 95 browserbuild, 293, 299 bufor, 63 call stack, Patrz: stos wywo(cid:225)a(cid:276) callback, Patrz: wywo(cid:225)anie zwrotne chmura, 49 Chrome, 38, 296 ciasteczka, 153 ci(cid:261)g znaków, 277 closure, Patrz: domkni(cid:266)cie Connect, 135, 139, 177 connection, Patrz: po(cid:225)(cid:261)czenie consumer key, 125 consumer secret, 125 controller, Patrz: kontroler CSS, 84 current working directory, Patrz: katalog roboczy bie(cid:298)(cid:261)cy czat, 92, 200, 207 rozszerzenia, 209 u(cid:298)ytkownik, 97, 98, 99, 100 D Dahl Ryan, 13, 15 dane baza, Patrz: baza danych pakiet, 88 sesji, 159 sprawdzanie poprawno(cid:286)ci, 235 struktura, 119 strumie(cid:276), Patrz: strumie(cid:276) danych typ, Patrz: typ danych wysy(cid:225)anie, 110, 123 data stream, Patrz: strumie(cid:276) danych datagram, 88 dependencies, 27 dokument, 222 g(cid:225)(cid:266)boko(cid:286)(cid:252), 222 ograniczanie liczby, 241 pomijanie, 241 szukanie, 228 tworzenie, 230 Kup książkęPoleć książkę 318 SKOROWIDZ dokument wstawianie, 228 wyszukiwanie, 232 zagnie(cid:298)d(cid:298)ony, 238 domkni(cid:266)cie, 31, 35 Don’t Repeat Yourself, Patrz: DRY DRY, 139 dziedziczenie, 40, 87, 298 klasyczne, 36 (cid:225)a(cid:276)cuch, 36 prototypowe, 36 dziennik, 83, 141, 142, 149 E ECMAScript, 38 EJS, 164 Embedded JavaScript, Patrz: EJS event, Patrz: zdarzenie EventEmitter, 297 execution stack, Patrz: stos wywo(cid:225)a(cid:276) Express, 17, 163, 170, 177, 248 F file descriptor, Patrz: plik deskryptor Firebug, 17 firewall, 195, 198 flaga, 171 format base64, 63 default, 149 dev, 149 JSON, 117, 126, 198 PNG, 63 short, 149 tiny, 149 tras, 166 XML, 117 formularz, 112, 117, 119, 227, 266 framework Connect, Patrz: Connect Express, Patrz: Express JavaScript, 182 Mocha, Patrz: Mocha programowania obiektowego, 294 Socket.IO, Patrz: socket.io framing, Patrz: ramkowanie funkcja, 33, 34 anonimowa, 35 argument, 34 arno(cid:286)(cid:252), 34 domkni(cid:266)cie, Patrz: domkni(cid:266)cie JavaScript, 140 318 obs(cid:225)ugi trasy, 166 rekurencyjna, 75 samowywo(cid:225)uj(cid:261)ca, 35 this, 34 try/catch, 37 zwracaj(cid:261)ca funkcj(cid:266), 142 zwrotna, 93, 111 GitHub, 17 gniazdo, 47, 182, 200 TCP, 73 grafika, 298 Grooveshark, 210 G H handshake, Patrz: wymiana potwierdze(cid:276) header, Patrz: nag(cid:225)ówek heartbeats, Patrz: taktowanie HTML5, 181 HTTP, 87, 105, 111, 116, 121, 124, 183, 260 nag(cid:225)ówek, Patrz: nag(cid:225)ówek HTTPS, Patrz: (cid:298)(cid:261)danie HTTP I in-memory store, Patrz: magazyn pami(cid:266)ciowy interfejs 2d Canvas, 294 connect, Patrz: connect DOM, 294 Node EventEmitter, Patrz: Node EventEmitter programistyczny, 56, 57, 58, 59, 62, 67, 294 adaptacja, 296 ECMA, 296 EventEmitter, 61, 62 fs, 70 ponad interfejsem klienta HTTP, 128 Stream, 82 TinySong, 210 Twittera, 124, 128 udost(cid:266)pnianie, 59 WebSocket, 184 wy(cid:298)szego rz(cid:266)du, 111 ReadStream, 110 stdio, 70 WebSocket, 294 XMLHttpRequest, 294 Internet Protocol, Patrz: protokó(cid:225) IP Internet Relay Chat, Patrz: IRC IRC, 102, 103 Kup książkęPoleć książkę J Jade, 172, 225, 248 instalowanie, 313 interpolacja, 256 JavaScript kompatybilno(cid:286)c, 294 konstruktor, 236 wersja podstawowa, 31, 32 v8, 31, 38 j(cid:266)zyk SQL, 247 szablonów, 164, 172 zapyta(cid:276) Redis, 275 jQuery, 182, 262, 266 JSON, 27, 117, 126, 198, 250, 266 deserializacja, 39, 169, 195 serializacja, 39, 195, 199 K katalog roboczy, 80, 84 bie(cid:298)(cid:261)cy, 80 klasa, 35 EventEmitter, 96 http.Server, 87 net.Server, 87 pochodna, 36 Schema, 236 klient HTTP, 108, 121, 128 IRC, 102, 103, 104 SSH, 87 TCP, 102 telnet, 90 Twittera, 121 klucz, 232, 240, 274 dost(cid:266)powy, 125 indeks, 239 kliencki, 125 Redis, 274, 277 type, 237 wype(cid:225)nianie automatyczne, 241 zagnie(cid:298)d(cid:298)ony, 238 kod ANSI, Patrz: sekwencja steruj(cid:261)ca ANSI asynchroniczny, 311 automatyczny, 96 bajtowy, 88, 96 HTML, 108 JSON, 27, 172, 250 utf-8, 96, 103, 122 wspó(cid:225)dzielony, 294 SKOROWIDZ kolekcja, 221 kompilator C/C++, 23 konstruktor, 32 http.ServerRequest, 106 http.ServerResponse, 106 JavaScript, 236 kontrola przeci(cid:261)(cid:298)e(cid:276), 89 przep(cid:225)ywu, 89 kontroler, 164 konwencja semver, 69 Kvalheim Christian Amor, 224 L latency, Patrz: opó(cid:296)nienie licznik, 94 limit czasowy, 89, 195, 198 Linuks Amazon, 23 Ubuntu, 23 Linux, 21 lista Redis, 279 locals object, Patrz: obiekt zmiennych lokalnych long polling, Patrz: odpytywanie wyd(cid:225)u(cid:298)one Ł 319 (cid:225)a(cid:276)cuch zapytania, 118, 119, 148 parsowanie, 148 znaków, Patrz: znak (cid:225)a(cid:276)cuch M magazyn pami(cid:266)ciowy, 274 mapa relacji, 281 tras, Patrz: trasa mapa mapowanie obiektowo-dokumentowe, Patrz: ODM Mened(cid:298)er Pakietów Node, Patrz: NPM metoda .apply, 34 .bind, 40 .call, 34 .filter, 39 .forEach, 39 .isArray, 39 .keys, 38 .lastIndexOf, 39 .reduce, 39 .reduceRight, 39 .toString( utf8 ), 96 319 Kup książkęPoleć książkę 320 SKOROWIDZ metoda .trim, 39 __defineGetter__, 41 __defineSetter__, 41 addEventListener, 61 app.disable, 171 app.disabled, 171 app.enable, 171 app.enabled, 171 app.error, 173 app.set, 166, 171 assert.ok, 307, 308 basicAuth, 160 blokuj(cid:261)ca, 46 bodyParser, 151, 154, 266 client.multi, 284 configure, 171 connect, 103 console.log, 75 cookieParser, 153, 154, 225 createClient, 250 createServer, 93, 94, 103, 111, 137, 149 del, 129, 166 DELETE, 116, 260 dispatchEvent, 61 emit, 61 express.createServer, 165 findOne, 234 fs.createReadStream, 83 fs.readdir, 71 fs.watch, 84 fs.watchFile, 84 get, 166 GET, 116, 126 head, 129, 166 HTTP, 113, 115 http.request, 128 index, 239 indexOf, 308 isDirectory, 74 join, 113 JSON.parse, 39 JSON.stringify, 39 listen, 94, 130 logger, 148, 154 methodOverride, 160 modu(cid:225)u expect.js, 309 mongoose.connect, 236 net.Stream#setEncoding, 96 next, 143, 168, 231 nieblokuj(cid:261)ca, 46 obs(cid:225)ugi zdarzenia, 50 on, 61 once, 161 320 patch, 166 PATCH, 116, 260 post, 129, 166 POST, 116 po(cid:286)rednicz(cid:261)ca, 239 po(cid:286)rednicz(cid:261)ca, 135, 140, 141, 146, 148, 153, 154, 160, 166, 173 do uwierzytelniania, 233 do(cid:225)(cid:261)czana warunkowo, 177 kompatybilna z Connect, 177 konfigurowalna, 142 przypisanie, 147 tworzenie, 143 wielokrotnego u(cid:298)ytku, 142 process.exit, 81 process.stdout.write, 75 put, 129, 166 PUT, 116 query, 148 readFile, 82 removeEventListener, 61 removeListener, 61 render, 167, 168 request, 122 request.get, 128 require, 172 send, 129, 184 sequelize.define, 264 session, 154, 155, 225 magazyn, 159 set, 129, 165 setEncoding, 122 setTimeout, 56, 110 slice, 80 static, 140, 146, 147, 266 hidden, 148 maxAge, 147 stringify, 123 updateAttributes, 270 use, 149 write, 110 writeFile, 82 writeHead, 109 (cid:298)(cid:261)dania, 116 middleware, Patrz: metoda po(cid:286)rednicz(cid:261)ca Mocha, 310, 311, 315 instalowanie, 313 model definiowanie, 264 DOM, 294, 298 Mongoose, 243 obiektowy Redis, 276 REST, Patrz: REST modularno(cid:286)(cid:252), 178 Kup książkęPoleć książkę modu(cid:225) assert, 298, 308 bezwzgl(cid:266)dny, 57 connect-redis, 159 definiowanie, 26 ejs, 172 expect.js, 308 formidable, 151 fs, 68, 70, 77, 82 http, 105, 136, 141 instalacja, 25 natywny, 136 net, 103 nieblokuj(cid:261)cy, 48 querystring, 118, 119, 126 search, 168 sequelize, 260 superagent, 128, 129, 164, 307 udost(cid:266)pnianie, 295 wzgl(cid:266)dny, 58 zewn(cid:266)trzny, 57 MongoDB, 221, 222, 223, 235 indeksowanie, 223 instalacja, 223 wydajno(cid:286)(cid:252), 223 Mongoose, 223, 236, 242 model, 243 mounting, Patrz: pod(cid:225)(cid:261)czanie, przypisanie multipleksacja, 200 MySQL, 247 N nag(cid:225)ówek, 107, 108 Authorization, 126 Connection, 109, 112 Content-Type, 107, 110, 111, 112, 117, 128 Cookie, 153 Transfer-Encoding, 109 najemca, 49 name, 27, 40 namespace, Patrz: przestrze(cid:276) nazw narz(cid:266)dzie binarne, 27 browserbuild, Patrz: browserbuild Firebug, Patrz: Firebug obs(cid:225)ugi daty, 294 REPL, Patrz: REPL telnet, Patrz: telnet up, 130 Web Inspector, Patrz: Web Inspector wiersza polece(cid:276), 27 niepodzielno(cid:286)(cid:252) operacji, 235 Node Package Manager, Patrz: NPM Node.JS instalacja, 21, 23 SKOROWIDZ node-mysql, 248 node-XMLHttpRequest, 298 nonprinting character, Patrz: znak niedrukowalny NoSQL, 247 notacja z kropk(cid:261), 238 NPM, 25, 26, 69, 224 instalacja modu(cid:225)u, 25 rejestr, 28 null, 33 O obiekt b(cid:225)(cid:266)du, 71 Buffer, 63, 96 console, 57 Date, 294 Error, 173 EventEmitter, 73 fs.WriteStream, 83 global, 56 globalny, 56 http.ServerResponse, 110 JavaScript, 111 Math, 294 odpowiedzi, 111 po(cid:225)(cid:261)czenia, 111 process, 56, 82 process.argv, 79 process.env, 81 process.EventEmitter, 61 process.stdin, 161 procesu, 56 req, 141 req.session, 156, 233 Request, 173 res, 141 Response, 173 rozszerzenie, 173 Schema, 237 sesji, 233 Stream, 73, 94 struktura danych, 119 window, 56, 61 XMLHTTPRequest, 61 zmiennych lokalnych, 168 (cid:298)(cid:261)dania, 111 Object-Relational Mapper, Patrz: ORM obserwacja, 83, 84 ODM, 223 odpowied(cid:296), 106 odpytywanie wyd(cid:225)u(cid:298)one, 198 odwzorowanie obiektowo-relacyjne, Patrz: ORM operacja wej(cid:286)cia-wyj(cid:286)cia, 47, 49, 63, 73, 83 321 321 Kup książkęPoleć książkę 322 SKOROWIDZ operator ~, 308 instanceof, 32, 36 typeof, 32, 33, 39 opó(cid:296)nienie, 187 ORM, 223, 247 OS X, 21 P parsowanie, 118, 128, 148, 199 r(cid:266)czne, 212 p(cid:266)tla wczytaj-wykonaj, Patrz: REPL zdarze(cid:276), 46, 47 PHP, 45, 46 pipe, Patrz: potok plik CSS, 84 deskryptor, 47 dziennika, Patrz: dziennik index.js, 92 JSON, 154 package.json, 26, 27, 58, 69, 92, 102, 112, 121, 139, 164, 224, 236 przetwarzany poleceniem node, 17 statyczny, 138, 139, 141 ukryty, 148 widoku, 167 wysy(cid:225)anie grupowe, 153 pod(cid:225)(cid:261)czanie, 179 podobiekt, 277 polecenie $ npm install, 69 console.log, 111 ensureIndex, 232 express, 28 GET, 276 HEXISTS, 276 HGETALL, 287 KEYS, 275 module.export, 154 node, 16, 68 npm install, 112 npm publish, 26 redis-cli, 275 require, 154, 224 search, 28 SELECT, 258 SET, 276 SMEMBERS, 276 USER, 103 view, 28 322 po(cid:225)(cid:261)czenie, 88, 94, 111 aktywne, 94 bezpieczne, 125 b(cid:225)(cid:261)d, 95 SSL, 125 telnet, 106 port http://localhost:3000, 106 potok, 47, 110 potwierdzenie, 89, 207 pow(cid:225)oka, 81 systemowa wiersz polece(cid:276), 22 proces d(cid:225)ugotrwa(cid:225)y, 45 program asynchroniczny, 47, 70, 76 pocztowy, 87 zako(cid:276)czenie, 81 programowanie behawioralne, 313 obiektowe, 294 oparte na testach, Patrz: TDD projekt protokó(cid:225) nazwa, 27 obiekt zale(cid:298)no(cid:286)ci, 27 publikacja, 27 wersja, 27 HTTP, Patrz: HTTP IP, 88 IRC, Patrz: IRC po(cid:225)(cid:261)czeniowy, 87 TCP, Patrz: TCP transportowy, 87 warstwy dost(cid:266)pu, 224 WebSocket, 184 prototyp, 35 przeci(cid:261)(cid:298)enie, 89 przegl(cid:261)darka, 56 Chrome, Patrz: Chrome Safari, Patrz: Safari przestrze(cid:276) nazw, 199 przetwarzanie wsadowe, 74 przypisanie, 147 pseudonim, 92, 96, 97, 99, 103, 203 Q query string, Patrz: (cid:225)a(cid:276)cuch zapytania R ramkowanie, 184 RAW TCP, 90 Read-Eval-Print Loop, Patrz: REPL Kup książkęPoleć książkę Redis, 158, 159, 274 instalacja, 275 j(cid:266)zyk zapyta(cid:276), 275 opcje utrwalania, 274 zalety, 280 refaktoring, 17, 68, 75 refaktoryzacja, 243 referencja, 32 rejestr NPM, 26, 69 REPL, 17, 24 REPL Node, 23 repozytorium GitHub, Patrz: GitHub request, Patrz: (cid:298)(cid:261)danie response, Patrz: odpowied(cid:296) REST, 260 rozg(cid:225)aszanie, 195, 203, 204 S Safari, 296 sekwencja steruj(cid:261)ca ANSI, 82 self-invoked functions, Patrz: funkcja samowywo(cid:225)uj(cid:261)ca sequelize, 260, 263, 271 pobieranie danych, 268 relacja, 265 usuwanie danych, 269 HTTP, 111, 122 HTTP Node, 130 kod, 92 proxy, 195, 198 prze(cid:225)adowanie, 130 Redis, 275 struktur danych, 273 TCP, 92, 111 w ró(cid:298)nych sieciach, 121 WWW, 88, 90, 106, 110 serial execution, Patrz: przetwarzanie wsadowe serwer sesji dane, 159 sesja u(cid:298)ytkownika, 154, 158, 280 shared-state concurrency, Patrz: wspó(cid:225)bie(cid:298)no(cid:286)(cid:252) stanu dzielonego shimming, Patrz: adaptacja sie(cid:252) spo(cid:225)eczno(cid:286)ciowa, 182, 200, 222 SIGKILL, 81 signal, Patrz: sygna(cid:225) silnik JavaScriptCore VM, 296 v8, 31, 296 skróty, 150 skrypt, 24 socket, Patrz: gniazdo socket.io, 17, 197, 198, 200 sortowanie, 240 SKOROWIDZ SQL injection, SQL wstrzykni(cid:266)cie kodu, 257 stack trace, Patrz: stos wywo(cid:225)a(cid:276) (cid:286)lad sterownik, 224 stos wykonania, Patrz: stos wywo(cid:225)a(cid:276) wywo(cid:225)a(cid:276), 40, 48 (cid:286)lad, 40, 51 strategia organizacji, 178 strumie(cid:276) danych, 88 do odczytu, 83, 138 do zapisu, 83, 138 kodowanie, 75 stderr, 72 stdin, 72 stdout, 72 wej(cid:286)cia, 123 wyj(cid:286)cia, 71 BDD, 313 eksportu, 314 TDD, 314 strumie(cid:276)przetwarzanie potokowe, 110 styl superagent, Patrz: modu(cid:225) superagent, Patrz: modu(cid:225) superagent sygna(cid:225) SIGKILL, 81 system logowania, 154 plików, 110 dost(cid:266)p asynchroniczny, 71 dost(cid:266)p synchroniczny, 71 szablonów, 164 szablon, 164, 225, 253 mechanizm, 165, 167, 172, 294 Ś (cid:286)rodowisko produkcyjne, 171 T tablica, 33, 71, 113, 258 argv, 126 asocjacyjna, 274, 277, 279 asocjacyjna opcji, 235 ci(cid:261)gów znaków, 279 metody, 39 taktowanie, 195 TCP, 87, 88, 92, 106, 183 TDD, 314 technologia AJAX, Patrz: AJAX WebSocket, Patrz: WebSocket telnet, 50, 89, 106, 184, 275 terminal, 23 323 323 Kup książkęPoleć książkę 324 typ SKOROWIDZ test kodu asynchronicznego, 311 kodu (cid:296)ród(cid:225)owego, 305 sprawdzaj(cid:261)cy, 305 tworzenie, 306 udost(cid:266)pnianie, 314 test-driven development, Patrz: TDD testowanie automatyczne, 305 timeout, Patrz: limit czasowy TinySong, 210 Transmission Control Protocol, Patrz: TCP transport, 198, 199 trasa, 166, 175, 228, 248, 258, 261 definiowanie, 226 dopasowanie, 176 format, 166 kontrola przep(cid:225)ywu, 176 mapa, 178 z parametrami, 175 trasowanie, 171 tryb bezpieczny, 235, 236 bezprotoko(cid:225)owy, 90 RAW TCP, 90 Twitter, 121, 124, 164, 306 aplikacja, 125 array, 32 boolean, 32 danych, 223 function, 32 konwersja, 242, 260 null, 32 number, 32 Number, 277, 294 object, 32 ObjectId, 237 prosty, 32 Sequelize, 264 string, 32 String, 277, 294 undefined, 32 z(cid:225)o(cid:298)ony, 32 U u(cid:298)ytkownik, 176, 250 czatu, 97, 98, 99, 100 logowanie, 154 mapa relacji spo(cid:225)ecznych, 281 obserwacja, 283 obserwowany, 281 obserwuj(cid:261)cy, 281 profil, 222 pseudonim, Patrz: pseudonim 324 sesja, Patrz: sesja u(cid:298)ytkownika to(cid:298)samo(cid:286)(cid:252), 200 uwierzytelnianie, 225, 233 uwierzytelnienie, 177 znajomy, 284 version, 27 view, Patrz: widok V W warto(cid:286)(cid:252) , 33 0, 33 null, Patrz: null undefined, 33 w(cid:261)tek wykonawczy, 47, 49 Web Inspector, 17 WebSocket, 184, 195, 197, 198, 294, 298 websocket.io, 185, 186 wersja numer, 147 numeracja kontroli, 69 White Nathan, 223 widok, 164, 167, 253 wiersz polece(cid:276), 68, 79 Windows, 21 wirtualizacja, 49 w(cid:225)a(cid:286)ciwo(cid:286)(cid:252) __proto__, 40 headers, 111 length, 34 name, 40, 119 private, 27 req.connection, 112 url, 114 wspó(cid:225)bie(cid:298)no(cid:286)(cid:252), 43, 47, 48, 71 stanu dzielonego, 44, 97 wydajno(cid:286)(cid:252), 43, 48 wyj(cid:261)tek AssertionError, 306 wymiana potwierdze(cid:276), 184 wywo(cid:225)anie X XML, 117 xmlhttprequest, 294 XTerm, 23 blokuj(cid:261)ce, 70 nieblokuj(cid:261)ce, 70, 173 wej(cid:286)cia-wyj(cid:286)cia, 173 zwrotne, 44, 46, 47, 51, 63, 93, 94, 230, 250 Kup książkęPoleć książkę SKOROWIDZ Z zmienna zale(cid:298)no(cid:286)(cid:252), 57, 69, 70, 92, 139, 144, 165, 224, 260 zakres definiowanie, 35 wewn(cid:266)trzny, 35 config, 251 express, 185, 248 mysql, 251 node-mysql, 249 zapytanie, 240 AJAX, 198, 266 SQL, 247 zasada DRY, 139 zbiór, 279, 280 sortowany, 280 zdarzenie, 61, 198 close, 95, 103, 195, 198 connect, 103, 198 connection, 199 data, 62, 103 delegacja, 269 disconnect, 198 emisja, 61, 62 end, 62, 95, 119, 122 error, 50, 62, 95, 252 generowanie, 198 nas(cid:225)uchiwanie, 61, 62, 96, 103, 198 obiektu process, 82 open, 198 po(cid:225)(cid:261)czenia, 250 uncaughtException, 50 _method, 160 globalna, 56, 70 exports, 57, 59 module, 57, 59 require, 57 licznika, Patrz: licznik NODE_ENV, 81 process, 70 prywatna, 35 res.body, 169 (cid:286)rodowiskowa, 81 url, 116 znak ci(cid:261)g, Patrz: ci(cid:261)g znaków diakrytyczny, 108 (cid:225)a(cid:276)cuch, 39 niedrukowalny, 82 ucieczki, 257 Ż (cid:298)(cid:261)danie, 106, 112 asynchroniczne, 182 czas odpowiedzi, 142, 144 DELETE, 160 GET, 307 HTTP, 73, 125, 126, 182 kolejno(cid:286)(cid:252), 182 PATCH, 160 POST, 182 PUT, 160 325 325 Kup książkęPoleć książkę NOTATKI 328 328 Kup książkęPoleć książkę
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Podręcznik Node.js. Smashing Magazine
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: