44

Tytuł oryginału: Node.js in Action - pdf.helion.plpdf.helion.pl/nodejs/nodejs.pdf · 4 Spis tre ci Rozdziaï 3. Podstawy programowania w Node 61 3.1. Organizacja i wielokrotne u

Embed Size (px)

Citation preview

Tytuł oryginału: Node.js in Action

Tłumaczenie: Robert Górczyński

Projekt okładki: Studio Gravite/OlsztynObarek, Pokoński, Pazdrijowski, Zaprucki

Materiały graficzne na okładce zostały wykorzystane za zgodą Shutterstock Images LLC.

ISBN: 978-83-246-9678-9

Original edition copyright © 2014 by Manning Publications Co.All rights reserved

Polish edition copyright © 2014 by HELION SA.All rights reserved.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.

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.

Autor oraz Wydawnictwo HELION dołożyli 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 HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: 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/nodejs.zip

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/nodejsMoż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 ciWst p 11Przedmowa 13Podzi kowania 15O ksi ce 17

CZ I. PODSTAWY NODE 19

Rozdzia 1. Witamy w Node.js 211.1. Node jest zbudowane w oparciu o JavaScript 221.2. Asynchroniczna i oparta na zdarzeniach: przegl darka internetowa 231.3. Asynchroniczny i oparty na zdarzeniach: serwer 251.4. Aplikacje DIRT 271.5. Domy lna aplikacja jest typu DIRT 29

1.5.1. Prosty przyk ad aplikacji asynchronicznej 301.5.2. Serwer HTTP 301.5.3. Strumieniowanie danych 32

1.6. Podsumowanie 33

Rozdzia 2. Tworzenie aplikacji wielopokojowego czatu 352.1. Ogólny opis aplikacji 362.2. Wymagania aplikacji i konfiguracja pocz tkowa 38

2.2.1. Obs uga HTTP i WebSocket 392.2.2. Tworzenie struktury plików aplikacji 392.2.3. Wskazanie zale no ci 402.2.4. Instalacja zale no ci 41

2.3. Udost pnianie plików HTML, CSS i kodu JavaScript dzia aj cegopo stronie klienta 412.3.1. Tworzenie podstawowego serwera plików statycznych 422.3.2. Dodanie plików HTML i CSS 45

2.4. Obs uga wiadomo ci czatu za pomoc biblioteki Socket.IO 462.4.1. Konfiguracja serwera Socket.IO 482.4.2. Obs uga zdarze oraz scenariuszy w aplikacji 49

2.5. U ycie kodu JavaScript dzia aj cego po stronie klienta do utworzeniainterfejsu u ytkownika aplikacji 542.5.1. Przekazywanie do serwera wiadomo ci

oraz da zmiany pokoju lub nazwy u ytkownika 542.5.2. Wy wietlenie w interfejsie u ytkownika wiadomo ci

i listy dost pnych pokoi 552.6. Podsumowanie 58

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

4 Spis tre ci

Rozdzia 3. Podstawy programowania w Node 613.1. Organizacja i wielokrotne u ycie kodu Node 62

3.1.1. Tworzenie modu u 643.1.2. Dostrajanie tworzenia modu u za pomoc module.exports 663.1.3. Wielokrotne u ycie modu ów za pomoc katalogu node_modules 683.1.4. Zastrze enia 68

3.2. Techniki programowania asynchronicznego 693.2.1. U ycie wywo a zwrotnych do obs ugi zdarze jednorazowych 713.2.2. U ycie emitera zdarze do obs ugi powtarzaj cych si zdarze 743.2.3. Wyzwania pojawiaj ce si podczas programowania asynchronicznego 82

3.3. Sekwencja logiki asynchronicznej 843.3.1. Kiedy stosowa szeregow kontrol przep ywu? 853.3.2. Implementacja szeregowej kontroli przep ywu 863.3.3. Implementacja równoleg ej kontroli przep ywu 893.3.4. U ycie narz dzi opracowanych przez spo eczno 91

3.4. Podsumowanie 92

CZ II. TWORZENIE APLIKACJI SIECIOWYCH W NODE 95

Rozdzia 4. Tworzenie aplikacji sieciowej w Node 974.1. Podstawy dotycz ce serwera HTTP 99

4.1.1. Jak przychodz ce dania HTTPs przez Node przedstawiane programi cie? 99

4.1.2. Prosty serwer HTTP odpowiadaj cy komunikatem „Witaj, wiecie” 1004.1.3. Odczyt nag ówków dania i zdefiniowanie nag ówków odpowiedzi 1014.1.4. Ustawienie kodu stanu odpowiedzi HTTP 102

4.2. Tworzenie us ugi sieciowej RESTful 1024.2.1. Tworzenie zasobów za pomoc da POST 1034.2.2. Pobieranie zasobów za pomoc dania GET 1054.2.3. Usuni cie zasobu za pomoc dania DELETE 107

4.3. Udost pnianie plików statycznych 1084.3.1. Tworzenie serwera plików statycznych 1094.3.2. Obs uga b dów serwera 1124.3.3. Wyprzedzaj ca obs uga b dów za pomoc wywo ania fs.stat() 113

4.4. Akceptacja danych wej ciowych u ytkownika przekazanychza pomoc formularza sieciowego 1144.4.1. Obs uga wys anych pól formularza sieciowego 1144.4.2. Obs uga przekazanych plików za pomoc formidable 1184.4.3. Sprawdzanie post pu operacji przekazywania plików 122

4.5. Zabezpieczanie aplikacji dzi ki u yciu protoko u HTTPS 1224.6. Podsumowanie 124

Rozdzia 5. Przechowywanie danych aplikacji Node 1255.1. Niewymagaj cy serwera magazyn danych 126

5.1.1. Magazyn danych w pami ci 1265.1.2. Magazyn danych oparty na plikach 127

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

Spis tre ci 5

5.2. System zarz dzania relacyjn baz danych 1305.2.1. MySQL 1315.2.2. PostgreSQL 139

5.3. Bazy danych typu NoSQL 1415.3.1. Redis 1415.3.2. MongoDB 1465.3.3. Mongoose 149

5.4. Podsumowanie 151

Rozdzia 6. Framework Connect 1536.1. Konfiguracja aplikacji Connect 1546.2. Jak dzia a metoda po rednicz ca frameworka Connect? 155

6.2.1. Metody po rednicz ce wy wietlaj ce danie 1566.2.2. Metoda po rednicz ca udzielaj ca odpowiedzi

w postaci komunikatu „Witaj, wiecie” 1576.3. Dlaczego kolejno metod po rednicz cych ma znaczenie? 158

6.3.1. Kiedy metoda po rednicz ca nie wywo uje next()? 1586.3.2. U ycie kolejno ci metod po rednicz cych

do przeprowadzenia uwierzytelnienia 1596.4. Montowanie metody po rednicz cej i serwera 160

6.4.1. Metody po rednicz ce przeprowadzaj ce uwierzytelnianie 1616.4.2. Metoda po rednicz ca wy wietlaj ca panel administracyjny 162

6.5. Tworzenie konfigurowalnej metody po rednicz cej 1646.5.1. Tworzenie konfigurowalnej metody po rednicz cej logger() 1646.5.2. Tworzenie metody po rednicz cej router() 1666.5.3. Tworzenie metody po rednicz cej przeznaczonej

do przepisywania adresów URL 1686.6. U ycie metody po rednicz cej do obs ugi b dów 170

6.6.1. Domy lna obs uga b dów w Connect 1706.6.2. Samodzielna obs uga b dów aplikacji 1716.6.3. U ycie wielu metod po rednicz cych przeznaczonych

do obs ugi b dów 1726.7. Podsumowanie 176

Rozdzia 7. Metody po rednicz ce frameworka Connect 1777.1. Metody po rednicz ce przeznaczone do przetwarzania plików cookie,

danych da i ci gów tekstowych zapyta 1797.1.1. cookieParser() — przetwarzanie plików cookie 1797.1.2. bodyParser() — przetwarzanie danych dania 1827.1.3. limit() — ograniczenie danych dania 1847.1.4. query() — analizator ci gu tekstowego zapytania 186

7.2. Metody po rednicz ce implementuj ce podstawowe funkcje wymaganeprzez aplikacj sieciow 1877.2.1. logger() — rejestracja informacji o daniu 1887.2.2. favicon() — obs uga ikon favicon 1917.2.3. methodOverride() — nieprawdziwe metody HTTP 1917.2.4. vhost() — wirtualny hosting 1947.2.5. session() — zarz dzanie sesj 195

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

6 Spis tre ci

7.3. Metody po rednicz ce zapewniaj ce bezpiecze stwo aplikacji sieciowej 2007.3.1. basicAuth() — uwierzytelnianie podstawowe HTTP 2007.3.2. csrf() — ochrona przed atakami typu CSRF 2027.3.3. errorHandler() — obs uga b dów w trakcie tworzenia aplikacji 203

7.4. Metody po rednicz ce przeznaczone do udost pniania plików statycznych 2057.4.1. static() — udost pnianie plików statycznych 2057.4.2. compress() — kompresja plików statycznych 2077.4.3. directory() — wy wietlenie katalogów 209

7.5. Podsumowanie 210

Rozdzia 8. Framework Express 2138.1. Utworzenie szkieletu aplikacji 215

8.1.1. Globalna instalacja frameworka Express 2168.1.2. Generowanie aplikacji 2188.1.3. Poznawanie aplikacji 218

8.2. Konfiguracja frameworka Express i tworzonej aplikacji 2208.2.1. Konfiguracja na podstawie rodowiska 221

8.3. Generowanie widoków aplikacji Express 2238.3.1. Konfiguracja systemu widoków 2248.3.2. Wyszukiwanie widoku 2258.3.3. Udost pnianie danych widokom 228

8.4. Obs uga formularzy i przekazywania plików 2328.4.1. Implementacja modelu zdj cia 2338.4.2. Tworzenie formularza przeznaczonego do przekazywania zdj 2338.4.3. Wy wietlenie listy przekazanych zdj 236

8.5. Obs uga pobierania zasobów 2378.5.1. Tworzenie trasy dla pobierania zdj 2378.5.2. Implementacja trasy pobierania zdj cia 238

8.6. Podsumowanie 240

Rozdzia 9. Zaawansowane u ycie frameworka Express 2419.1. Uwierzytelnianie u ytkowników 242

9.1.1. Zapisywanie i wczytywanie u ytkowników 2439.1.2. Rejestrowanie nowego u ytkownika 2489.1.3. Logowanie zarejestrowanych u ytkowników 2549.1.4. Metoda po rednicz ca przeznaczona do wczytywania u ytkownika 257

9.2. Zaawansowane techniki routingu 2599.2.1. Weryfikacja u ytkownika podczas przesy ania tre ci 2609.2.2. Metoda po rednicz ca charakterystyczna dla trasy 2639.2.3. Implementacja stronicowania 266

9.3. Utworzenie publicznego API REST 2709.3.1. Projekt API 2709.3.2. Dodanie uwierzytelnienia podstawowego 2719.3.3. Implementacja routingu 2729.3.4. W czenie negocjacji tre ci 275

9.4. Obs uga b dów 2779.4.1. Obs uga b dów 404 2789.4.2. Obs uga b dów 280

9.5. Podsumowanie 283

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

Spis tre ci 7

Rozdzia 10. Testowanie aplikacji Node 28510.1. Testy jednostkowe 286

10.1.1. Modu assert 28710.1.2. Framework nodeunit 29110.1.3. Mocha 29310.1.4. Framework Vows 29810.1.5. Biblioteka should.js 301

10.2. Testy akceptacyjne 30310.2.1. Tobi 30310.2.2. Soda 305

10.3. Podsumowanie 307

Rozdzia 11. Szablony w aplikacji sieciowej 30911.1. U ycie szablonów w celu zachowania przejrzysto ci kodu 310

11.1.1. Szablon w akcji 31111.2. Silnik szablonów Embedded JavaScript 314

11.2.1. Tworzenie szablonu 31511.2.2. Praca z danymi szablonu za pomoc filtrów EJS 31611.2.3. Integracja EJS w aplikacji 32011.2.4. U ycie EJS w aplikacjach dzia aj cych po stronie klienta 321

11.3. U ycie j zyka szablonów Mustache wraz z silnikiem Hogan 32211.3.1. Tworzenie szablonu 32211.3.2. Znaczniki Mustache 32311.3.3. Dostosowanie szablonu Hogan do w asnych potrzeb 325

11.4. Szablony Jade 32611.4.1. Podstawy szablonów Jade 32811.4.2. Logika w szablonach Jade 33011.4.3. Organizacja szablonów Jade 333

11.5. Podsumowanie 337

CZ III. CO DALEJ? 339

Rozdzia 12. Wdra anie aplikacji Nodei zapewnienie bezawaryjnego dzia ania 341

12.1. Hosting aplikacji Node 34212.1.1. Serwery dedykowane i VPS 34312.1.2. Hosting w chmurze 343

12.2. Podstawy wdro enia 34612.2.1. Wdro enie z repozytorium Git 34612.2.2. Zapewnienie dzia ania aplikacji Node 347

12.3. Maksymalizacja wydajno ci i czasu bezawaryjnego dzia ania aplikacji 34812.3.1. Zapewnienie dzia ania aplikacji za pomoc Upstart 34912.3.2. API klastra wykorzystanie zalety w postaci wielu rdzeni 35112.3.3. Proxy i hosting plików statycznych 353

12.4. Podsumowanie 354

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

8 Spis tre ci

Rozdzia 13. Nie tylko serwery WWW 35513.1. Biblioteka Socket.IO 356

13.1.1. Tworzenie minimalnej aplikacji Socket.IO 35713.1.2. U ycie biblioteki Socket.IO do od wie enia strony i stylów CSS 35913.1.3. Inne zastosowania dla biblioteki Socket.IO 362

13.2. Dok adniejsze omówienie sieci TCP/IP 36313.2.1. Praca z buforami i danymi binarnymi 36313.2.2. Tworzenie serwera TCP 36513.2.3. Tworzenie klienta TCP 369

13.3. Narz dzia przeznaczone do pracy z systemem operacyjnym 37113.3.1. Obiekt process, czyli globalny wzorzec Singleton 37113.3.2. U ycie modu u filesystem 37513.3.3. Tworzenie procesów zewn trznych 379

13.4. Tworzenie narz dzi pow oki 38413.4.1. Przetwarzanie argumentów podanych w pow oce 38513.4.2. Praca ze standardowym wej ciem i wyj ciem 38613.4.3. Dodanie koloru do danych wyj ciowych 388

13.5. Podsumowanie 391

Rozdzia 14. Ekosystem Node 39314.1. Dost pne w internecie zasoby dla programistów Node 394

14.1.1. Node i odniesienia do modu ów 39414.1.2. Grupy Google 39514.1.3. IRC 39614.1.4. Zg aszanie problemów w serwisie GitHub 397

14.2. Serwis GitHub 39814.2.1. Rozpocz cie pracy z GitHub 39814.2.2. Dodanie projektu do GitHub 39914.2.3. Wspó praca przez serwis GitHub 403

14.3. Przekazanie w asnego modu u do repozytorium npm 40514.3.1. Przygotowanie pakietu 40614.3.2. Przygotowanie specyfikacji pakietu 40614.3.3. Testowanie i publikowanie pakietu 407

14.4. Podsumowanie 409

Dodatek A. Instalacja Node i dodatki opracowane przez spo eczno 411A.1. Instalacja w systemie OS X 411

A.1.1. Instalacja za pomoc Homebrew 412A.2. Instalacja w systemie Windows 413A.3. Instalacja w systemie Linux 414

A.3.1. Przygotowania do instalacji w Ubuntu 414A.3.2. Przygotowania do instalacji w CentOS 415

A.4. Kompilacja Node 415A.5. U ywanie mened era pakietów Node 416

A.5.1. Wyszukiwanie pakietów 417A.5.2. Instalacja pakietu 418A.5.3. Przegl danie dokumentacji i kodu pakietu 419

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

Spis tre ci 9

Dodatek B. Debugowanie Node 421B.1. Analiza kodu za pomoc JSHint 421B.2. Dane wyj ciowe debugowania 422

B.2.1. Debugowanie za pomoc modu u console 422B.2.2. U ycie modu u debug do zarz dzania danymi wyj ciowymi

procesu debugowania 423B.3. Debuger wbudowany w Node 424

B.3.1. Nawigacja po debugerze 424B.3.2. Analiza i zmiana stanu w debugerze 425

B.4. Inspektor Node 426B.4.1. Uruchomienie inspektora Node 426B.4.2. Nawigacja po inspektorze Node 426B.4.3. Przegl danie stanu w inspektorze Node 427

Dodatek C. Rozszerzenie i konfiguracja frameworka Express 429C.1. Rozszerzenie frameworka Express 429

C.1.1. Rejestracja szablonów silników 429C.1.2. Szablony i projekt consolidate.js 430C.1.3. Frameworki i rozszerzenia Express 431

C.2. Konfiguracja zaawansowana 432C.2.1. Modyfikacja odpowiedzi JSON 433C.2.2. Formatowanie odpowiedzi JSON 433

Skorowidz 435

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

10 Spis tre ci

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

Tworzenie aplikacjiwielopokojowego czatu

W tym rozdziale: Pierwsze spojrzenie na ró ne komponenty Node.

Przyk ad aplikacji Node dzia aj cej w czasierzeczywistym.

Wspó praca mi dzy klientem i serwerem.

W rozdziale 1. dowiedzia e si , jak programowanie asynchroniczne z u yciem Noderó ni si od konwencjonalnego programowania synchronicznego. W tym rozdziale wyko-rzystamy platform Node w praktyce do utworzenia ma ej, opartej na zdarzeniach apli-kacji czatu. Nie przejmuj si , je li nie zrozumiesz ca ego materia u przedstawionegow rozdziale. Naszym celem jest obja nienie sposobu programowania z u yciem Nodei jedynie zaprezentowanie mo liwo ci, jakie b dziesz mie po zako czeniu lekturyniniejszej ksi ki.

W rozdziale przyj to za o enie, e masz do wiadczenie w programowaniu aplikacjisieciowych, a tak e podstawow wiedz z zakresu HTTP i biblioteki jQuery. W trakcielektury materia u przedstawionego w tym rozdziale:

poznasz tworzon aplikacj i zobaczysz, jak dzia a; poznasz technologie wymagane do jej utworzenia i przeprowadzisz pocz tkow

konfiguracj aplikacji; przygotujesz dla aplikacji kod HTML, CSS i JavaScript dzia aj cy po stronie

klienta;

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

36 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

zajmiesz si obs ug wiadomo ci czatu za pomoc biblioteki Socket.IO; za pomoc kodu JavaScript dzia aj cego po stronie klienta przygotujesz

interfejs u ytkownika aplikacji.

Zaczynamy od ogólnego omówienia aplikacji — dowiesz si , jak aplikacja b dzie wygl -da i dzia a , gdy zako czymy proces jej tworzenia.

2.1. Ogólny opis aplikacjiAplikacja tworzona w tym rozdziale pozwala u ytkownikom na prowadzenie mi dzysob internetowego czatu przez wprowadzanie wiadomo ci w prostym formularzu, jakpokazano na rysunku 2.1. Wprowadzona w formularzu wiadomo zostaje wys anawszystkim uczestnikom czatu znajduj cym si w tym samym pokoju.

Rysunek 2.1. Wprowadzenie wiadomo ci w aplikacji czatu

Po uruchomieniu aplikacji u ytkownikowi automatycznie b dzie przypisana nazwago cia, któr mo e zmieni przez wydanie polecenia, jak pokazano na rysunku 2.2.Polecenia czatu s poprzedzane uko nikiem (/).

Rysunek 2.2. Zmiana nazwy u ytkownika czatu

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

2.1. Ogólny opis aplikacji 37

Podobnie u ytkownik mo e wyda polecenie utworzenia nowego pokoju czatu (lub do -czenia do istniej cego), co pokazano na rysunku 2.3. Podczas tworzenia pokoju czatunazwa nowego pokoju b dzie wy wietlana na poziomym pasku znajduj cym si na górzeaplikacji czatu. Sam pokój zostanie równie umieszczony na li cie dost pnych pokoiwy wietlanej po prawej stronie obszaru wiadomo ci.

Rysunek 2.3. Zmiana pokojuczatu

Po przej ciu u ytkownika do nowego pokoju system potwierdzi t zmian , jak poka-zano na rysunku 2.4.

Rysunek 2.4. Wynik przej ciado nowego pokoju czatu

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

38 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

Wprawdzie funkcjonalno omawianej tutaj aplikacji bez w tpienia jest bardzo ogra-niczona, ale jednocze nie prezentuje ona wa ne i podstawowe koncepcje wymagane doutworzenia aplikacji sieciowej dzia aj cej w czasie rzeczywistym. Omawiania aplikacjipokazuje, jak Node mo e oferowa dane HTTP (na przyk ad pliki statyczne) i jednocze-nie obs ugiwa dane w czasie rzeczywistym (wiadomo ci czatu). Ponadto dzi ki oma-

wianej aplikacji mo esz si przekona , jak zorganizowane s aplikacje Node i jak wygl dazarz dzanie zale no ciami.

Teraz przejdziemy do technologii wymaganych do implementacji aplikacji czatu.

2.2. Wymagania aplikacji i konfiguracja pocz tkowaTworzona w rozdziale aplikacja musi oferowa :

Udost pnianie plików statycznych (takich jak HTML, CSS i skrypty JavaScriptdzia aj ce po stronie klienta).

Obs ug przez serwer wiadomo ci czatu. Obs ug wiadomo ci czatu w przegl darce internetowej u ytkownika.

Aby udost pnia pliki statyczne, wykorzystamy modu http wbudowany w Node. Jednakpodczas udost pniania plików za pomoc protoko u HTTP zwykle nie wystarczy jedyniewys a zawarto pliku. Konieczne jest równie wskazanie rodzaju wysy anego pliku.Odbywa si to przez ustawienie nag ówka Content-Type protoko u HTTP i podaniew a ciwego typu MIME dla pliku. W celu wyszukania wspomnianych typów MIMEtrzeba b dzie u y modu u o nazwie mime opracowanego przez firm trzeci .

TYPY MIME. Dok adne omówienie typów MIME znajdziesz w artykule Wiki-pedii: http://pl.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions.

Do obs ugi wiadomo ci zwi zanych z czatem mo na wykorzysta technologi Ajax.Jednak aby zachowa jak najwi kszy stopie reakcji aplikacji na dzia ania u ytkownika,konieczne jest unikni cie tradycyjnego rozwi zania Ajax stosowanego do wysy ania wia-domo ci. Ajax u ywa protoko u HTTP jako mechanizmu transportowego, a wspom-niany HTTP nie zosta opracowany do prowadzenia komunikacji w czasie rzeczywistym.Kiedy wiadomo jest wysy ana za pomoc HTTP, konieczne jest u ycie nowego po -czenia TCP/IP. Otwieranie i zamykanie po cze zabiera cenny czas, a ilo przekazy-wanych danych ro nie, poniewa ka de danie zawiera nag ówki HTTP. Zamiastimplementowa rozwi zanie oparte na HTTP, w omawianej aplikacji wykorzystamytechnologi WebSocket (http://pl.wikipedia.org/wiki/WebSocket). Zosta a ona zaprojek-towana do prowadzenia dwukierunkowej, lekkiej komunikacji w czasie rzeczywistym zapomoc jednego gniazda TCP.

Poniewa w wi kszo ci przypadków jedynie przegl darki zgodne z HTML5 obs u-guj WebSocket, w aplikacji u yjemy popularnej biblioteki Socket.IO (http://socket.io/).Ta biblioteka oferuje wiele rozwi za awaryjnych, mi dzy innymi u ycie technologiiFlash, gdy zastosowanie WebSocket oka e si niemo liwe. Wspomniane rozwi zania

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

2.2. Wymagania aplikacji i konfiguracja pocz tkowa 39

awaryjne s automatycznie obs ugiwane przez bibliotek Socket.IO i nie wymagajdodatkowego kodu lub konfiguracji. Dok adniejsze omówienie biblioteki Socket.IOznajdziesz w rozdziale 13.

Zanim faktycznie zajmiemy si prac i przyst pimy do pocz tkowej konfiguracjistruktury plików i zale no ci aplikacji, warto dowiedzie si , jak Node pozwala na jed-noczesn obs ug HTTP i WebSocket. To jeden z powodów, dla których platforma Nodejest doskona ym wyborem w przypadku aplikacji dzia aj cych w czasie rzeczywistym.

2.2.1. Obs uga HTTP i WebSocket

Wprawdzie w omawianej aplikacji unikamy u ycia technologii Ajax do wysy aniai otrzymywania wiadomo ci czatu, ale nadal korzystamy z HTTP do dostarczania plikówHTML, CSS i kodu JavaScript dzia aj cego po stronie klienta, które powoduj przy-gotowanie aplikacji w przegl darce internetowej u ytkownika.

Jak pokazano na rysunku 2.5, Node mo e bardzo atwo jednocze nie obs ugiwaHTTP i WebSocket za pomoc pojedynczego portu TCP/IP. Standardowo zawieramodu zapewniaj cy obs ug funkcjonalno ci HTTP. Dla Node firmy trzecie opraco-wa y równie wiele innych modu ów, na przyk ad Express, które zosta y zbudowanew oparciu o standardowe funkcje oferowane przez Node i pozwalaj na jeszcze atwiejszeudost pnianie tre ci. Wi cej informacji dotycz cych u ycia modu u Express podczastworzenia aplikacji sieciowych znajdziesz w rozdziale 8. W aplikacji tworzonej w tymrozdziale wykorzystamy standardowe mo liwo ci Node.

Rysunek 2.5. Obs uga HTTP i WebSocket w jednej aplikacji

Skoro dowiedzia e si ju , jakie podstawowe technologie b d wykorzystane w budo-wanej aplikacji, mo emy przyst pi do pracy.

Czy musisz zainstalowa Node?Je eli jeszcze nie zainstalowa e Node, dok adne omówienie instalacji znajdziesz w do-datku A.

2.2.2. Tworzenie struktury plików aplikacji

Pierwszym krokiem podczas budowy omawianej aplikacji jest utworzenie katalogudla projektu. G ówny plik aplikacji b dzie umieszczony we wspomnianym katalogu.Konieczne jest równie dodanie podkatalogu lib, w którym znajdzie si logika dzia aj ca

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

40 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

po stronie serwera. Ponadto trzeba utwo-rzy podkatalog public przeznaczony dlaplików u ywanych po stronie klienta.Nast pnie w podkatalogu public utwórz dwakolejne: javascripts i stylesheets.

Struktura katalogów powinna wygl datak, jak pokazano na rysunku 2.6. Wartow tym miejscu doda , e cho zdecydowa-li my si na organizacj plików w przedsta-wiony sposób, to jednak Node nie wymagastosowania adnej struktury plików. Plikisk adaj ce si na aplikacj mo esz umie ciw najbardziej odpowiadaj cy Ci sposób.

Rysunek 2.6. Struktura katalogu projektudla aplikacji czatu

Po przygotowaniu struktury katalogów mo emy przyst pi do zdefiniowania zale no-ci aplikacji.

W omawianym kontek cie zale no aplikacji oznacza modu y konieczne do zainsta-lowania, aby dostarczy funkcje wymagane przez aplikacj . Na przyk ad przyjmujemyza o enie o tworzeniu aplikacji wymagaj cej dost pu do danych przechowywanychw bazie danych MySQL. Node nie jest standardowo wyposa one w modu pozwalaj cyna uzyskanie dost pu do MySQL. Konieczna jest wi c instalacja modu u opracowa-nego przez firm trzeci i wspomniany modu jest wówczas zale no ci .

2.2.3. Wskazanie zale no ci

Wprawdzie istnieje mo liwo utworzenia aplikacji Node bez wskazywania zale no ci,ale dobrym nawykiem jest po wi cenie chwili czasu na ich zdefiniowanie. W ten sposóbkonfiguracja aplikacji b dzie nieco atwiejsza, je li inny u ytkownik b dzie chcia u ywatej aplikacji lub je li planujesz jej uruchamianie w wi cej ni tylko jednym miejscu.

Zale no ci aplikacji s definiowane w pliku o nazwie package.json. Wymienionyplik zawsze powinien znajdowa si w katalogu g ównym aplikacji. Zawarto plikupackage.json to wyra enie JSON w standardzie opisu pakietu CommonJS (http://wiki.commonjs.org/wiki/Packages/1.0) opisuj ce aplikacj . W pliku package.json mo na podawiele informacji, ale najwa niejsze to nazwa aplikacji, wersja, opis jej dzia ania orazzale no ci aplikacji.

W listingu 2.1 przedstawiono plik opisuj cy funkcjonalno i zale no ci aplikacjitworzonej w tym rozdziale. Plik zapisz pod nazw package.json w katalogu g ównymaplikacji.

Listing 2.1. Plik opisuj cy aplikacj

{ "name": "chatrooms", "version": "0.0.1", "description": "Minimalistyczny serwer wielopokojowego czatu", "dependencies": { "socket.io": "~0.9.6",

Nazwa pakietu.

Zale no ci pakietu.

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

2.3. Udost pnianie plików HTML, CSS i kodu JavaScript dzia aj cego po stronie klienta 41

"mime": "~1.2.7" }}

Je eli zawarto pliku wydaje Ci si nieco dziwna, nie przejmuj si tym teraz. Wi cejinformacji dotycz cych pliku package.json znajdziesz w nast pnym rozdziale, a jegodok adne omówienie w rozdziale 14.

2.2.4. Instalacja zale no ci

Po zdefiniowaniu pliku package.json instalacja zale no ci aplikacji staje si niezwykleatwym zadaniem. Mened er pakietów Node (https://github.com/npm/npm) jest dostar-

czany standardowo wraz z Node. Oferuje doskona e funkcje, mi dzy innymi mo liwoatwej instalacji modu ów Node opracowanych przez firmy trzecie oraz globalnego udo-

st pniania modu ów opracowanych przez Ciebie. Ponadto za pomoc pojedynczego pole-cenia potrafi odczyta zale no ci z pliku package.json, a nast pnie je zainstalowa .

Z poziomu katalogu g ównego tworzo-nej aplikacji wydaj poni sze polecenie:

npm install

Je eli teraz zajrzysz do katalogu aplikacji,przekonasz si , e jest w nim nowy podka-talog o nazwie node_modules, jak pokazanona rysunku 2.7. Wymieniony podkatalogzawiera zale no ci aplikacji.

Maj c przygotowan struktur kataloguaplikacji i zainstalowane zale no ci, mo naju przyst pi do tworzenia logiki aplikacji. Rysunek 2.7. Po u yciu mened era npm

do instalacji zale no ci zostanie utworzonypodkatalog o nazwie node_modules

2.3. Udost pnianie plików HTML, CSS i kodu JavaScriptdzia aj cego po stronie klienta

Jak wcze niej wspomniano, budowana tutaj aplikacja czatu powinna oferowa wymie-nione poni ej mo liwo ci:

Udost pnianie plików statycznych przegl darce internetowej u ytkownika. Obs ug przez serwer wiadomo ci zwi zanych z czatem. Obs ug wiadomo ci czatu w przegl darce internetowej u ytkownika.

Logika aplikacji b dzie obs ugiwana przez wiele plików, cz wykorzystywanych postronie serwera, inne po stronie klienta, jak pokazano na rysunku 2.8. Pliki kodu Java-Script dzia aj cego po stronie klienta musz by udost pniane w postaci zasobów sta-tycznych, a nie przetwarzane przez Node.

W tym podrozdziale zajmiemy si spe nieniem pierwszego wymagania stawianegoaplikacji: zdefiniujemy logik niezb dn do udost pniania plików statycznych. Nast p-nie dodamy pliki statyczne z kodem HTML i CSS.

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

42 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

Rysunek 2.8.W budowanej aplikacjiczatu po stronie zarównoserwera, jak i klientaistnieje logika JavaScript

2.3.1. Tworzenie podstawowego serwera plików statycznych

Aby utworzy serwer plików statycznych, konieczne jest wykorzystanie pewnych wbu-dowanych funkcji Node, a tak e opracowanego przez firm trzeci modu u mime w celuustalenia typu MIME danego pliku.

Rozpoczynamy od g ównego pliku aplikacji. W katalogu g ównym projektu utwórzplik o nazwie server.js i umie w nim deklaracje zmiennych przedstawione w lis-tingu 2.2. Wspomniane deklaracje pozwalaj na uzyskanie dost pu do funkcji HTTPw Node, a tak e na prac z systemem plików, u ycie funkcji zwi zanych ze cie kamidost pu do plików oraz mo liwo ustalenia typu MIME danego pliku. Zmienn cachewykorzystamy do buforowania danych pliku.

Listing 2.2. Deklaracje zmiennych

var http = require('http');

var fs = require('fs');

var path = require('path');

var mime = require('mime');

var cache = {};

Wbudowany modu http dostarcza funkcje dotycz ce serwera i klienta.

Wbudowany modu fs dostarcza funkcje przeznaczonedo pracy z systemem plików.

Wbudowany modu path dostarcza funkcje przeznaczonedo pracy ze cie kami dost pu systemu plików.

Dodatkowy modu mime zapewniamo liwo ustalenia typu MIMEna podstawie rozszerzenia pliku.Obiekt cache s u y do przechowywania

buforowanych plików.

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

2.3. Udost pnianie plików HTML, CSS i kodu JavaScript dzia aj cego po stronie klienta 43

WYSY ANIE DANYCH PLIKU I ODPOWIEDZI W POSTACI B DÓW

Kolejnym krokiem jest utworzenie trzech funkcji pomocniczych u ywanych do udost p-niania statycznych plików HTTP. Pierwsza powoduje wygenerowanie b du o kodzie404, je li dany plik nie istnieje. W pliku server.js umie wi c poni szy kod funkcjipomocniczej:function send404(response) { response.writeHead(404, {'Content-Type': 'text/plain'}); response.write('B d 404: plik nie zosta znaleziony.'); response.end();}

Druga funkcja pomocnicza dostarcza dane pliku. Najpierw przygotowuje odpowiednienag ówki HTTP, a nast pnie wysy a zawarto pliku. W pliku server.js umie wi cponi szy kod:function sendFile(response, filePath, fileContents) { response.writeHead( 200, {"content-type": mime.lookup(path.basename(filePath))} ); response.end(fileContents);}

Uzyskanie dost pu do pami ci operacyjnej (RAM) jest szybsze ni do systemu plików.Dlatego te aplikacje Node buforuj w pami ci cz sto u ywane dane. Budowana tutajaplikacja czatu b dzie buforowa a w pami ci pliki statyczne i odczyta je z dysku tylkopodczas pierwszego ich dania. Trzecia funkcja pomocnicza sprawdza wi c, czy plikjest buforowany, a nast pnie go udost pnia. Je eli plik nie jest jeszcze buforowany,wtedy zostanie odczytany z dysku i udost pniony. Je eli plik nie istnieje, odpowiedzib dzie kod b du HTTP 404. W pliku server.js umie wi c kod funkcji pomocniczejprzedstawionej w listingu 2.3.

Listing 2.3. Funkcja pomocnicza udost pniaj ca pliki statyczne

function serveStatic(response, cache, absPath) { if (cache[absPath]) { sendFile(response, absPath, cache[absPath]); } else { fs.exists(absPath, function(exists) { if (exists) { fs.readFile(absPath, function(err, data) { if (err) { send404(response); } else { cache[absPath] = data; sendFile(response, absPath, data); } }); } else { send404(response); }

Sprawdzenie, czy plik jest buforowanyw pami ci.

Udost pnienie pliku z pami ci.

Sprawdzenie, czy plik istnieje.

Odczyt pliku z dysku.

Udost pnienie pliku odczytanego z dysku.

Wys anie odpowiedzi HTTP 404.

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

44 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

}); }}

TWORZENIE SERWERA HTTP

W przypadku serwera HTTP funkcja anonimowa dostarczana jako argument funkcjicreateServer() dzia a w charakterze wywo ania definiuj cego sposób obs ugi poszcze-gólnych da HTTP. Funkcja wywo ania zwrotnego akceptuje dwa argumenty: requesti response. Podczas jej wywo ania serwer HTTP wype ni wspomniane argumenty obiek-tami, które pozwol na odpowiednio odczyt szczegó ów dania oraz przygotowanieodpowiedzi. Wi cej informacji o module http Node znajdziesz w rozdziale 4.

W pliku server.js umie kod przedstawiony w listingu 2.4, odpowiedzialny za utwo-rzenie serwera HTTP.

Listing 2.4. Logika tworz ca serwer HTTP

var server = http.createServer(function(request, response) { var filePath = false;

if (request.url == '/') { filePath = 'public/index.html'; } else { filePath = 'public' + request.url; }

var absPath = './' + filePath; serveStatic(response, cache, absPath);});

URUCHOMIENIE SERWERA HTTP

W kodzie utworzyli my serwer HTTP, ale nie dodali my jeszcze logiki niezb dnej dojego uruchomienia. Poni szy fragment kodu powoduje uruchomienie serwera i nas u-chiwanie TCP/IP na porcie 3000. Port 3000 zosta wybrany dowolnie, mo na skorzy-sta z ka dego nieu ywanego portu o numerze wi kszym ni 1024 (port 1024 równiemo e dzia a , je li korzystasz z systemu Windows, natomiast w systemach Linux i OS Xkonieczne jest wówczas uruchomienie aplikacji przez u ytkownika uprzywilejowanego,na przyk ad root).server.listen(3000, function() { console.log("Serwer nas uchuje na porcie 3000.");});

Je eli chcesz si przekona , jak aplikacja dzia a na tym etapie, to mo esz uruchomiserwer przez wydanie poni szego polecenia w wierszu polece :node server.js

Po uruchomieniu serwera przej cie pod adres http://127.0.0.1:3000 w przegl darce inter-netowej spowoduje wywo anie funkcji pomocniczej generuj cej kod b du 404, a wi cwy wietlenie komunikatu B d 404: plik nie zosta znaleziony. Wprawdzie aplikacja

Utworzenie serwera HTTPza pomoc funkcji anonimowejdefiniuj cej zachowaniew poszczególnych daniach.

Wskazanie pliku HTML,który ma by domy lnieudost pniany.

Zamiana adresu URL na wzgl dncie k dost pu do pliku.

Udost pnienie pliku statycznego.

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

2.3. Udost pnianie plików HTML, CSS i kodu JavaScript dzia aj cego po stronie klienta 45

zawiera logik odpowiedzialn za obs ug plików statycznych, ale jeszcze nie dodali myadnego tego rodzaju pliku. Warto w tym miejscu wspomnie , e dzia anie serwera

mo na zatrzyma przez naci ni cie klawiszy Ctrl+C w pow oce.Przechodzimy teraz do dodania plików statycznych zapewniaj cych nieco wi ksz

funkcjonalno aplikacji czatu.

2.3.2. Dodanie plików HTML i CSS

Pierwszy dodawany plik statyczny zawiera kod HTML. W katalogu public utwórz pliko nazwie index.html, a nast pnie umie w nim kod HTML przedstawiony w listingu 2.5.Wspomniany kod HTML powoduje do czenie pliku arkusza stylów (CSS), zdefiniowa-nie pewnych elementów HTML <div> przeznaczonych do wy wietlania tre ci aplikacji,a tak e do wczytania kilku plików zawieraj cych kod JavaScript dzia aj cy po stronieklienta. Pliki JavaScript zapewniaj dost p do funkcji biblioteki Socket.IO, bibliotekijQuery (w celu atwiejszej pracy z modelem DOM), a tak e oferuj przygotowanespecjalnie dla budowanej aplikacji funkcje obs ugi czatu.

Listing 2.5. Kod HTML aplikacji czatu

<!doctype html><html lang='en'>

<head> <title>Czat</title> <link rel='stylesheet' href='/stylesheets/style.css'></link></head>

<body><div id='content'> <div id='room'></div> <div id='room-list'></div> <div id='messages'></div>

<form id='send-form'> <input id='send-message' /> <input id='send-button' type='submit' value='Wy lij'/>

<div id='help'> Polecenia czatu: <ul> <li>Zmiana nazwy u ytkownika: <code>/nick [nazwa u ytkownika]</code></li> <li>Przej cie do lub utworzenie pokoju: <code>/join [nazwa pokoju]</code></li> </ul> </div> </form></div>

<script src='/socket.io/socket.io.js' type='text/javascript'></script><script src='http://code.jquery.com/jquery-1.8.0.min.js' type='text/javascript'></script><script src='/javascripts/chat.js' type='text/javascript'></script><script src='/javascripts/chat_ui.js' type='text/javascript'></script></body></html>

Element <div>, w którym b dziewy wietlona nazwa aktualnegopokoju czatu.

Element <div>, w którym b dziewy wietlona lista dost pnychpokoi czatu.

Element <div>, w którymb d wy wietlonewiadomo ci czatu.

Element <input> formularza,w którym u ytkownik b dziewydawa polecenia i wpisywawiadomo ci.

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

46 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

Kolejny plik, który trzeba doda , zawiera style CSS u ywane w aplikacji. W katalogupublic/stylesheets utwórz plik o nazwie style.css, a nast pnie umie w nim kod CSSprzedstawiony w listingu 2.6.

Listing 2.6. Kod CSS u ywany przez aplikacj

body { padding: 50px; font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;}

a { color: #00B7FF;}

#content { width: 800px; margin-left: auto; margin-right: auto;}

#room { background-color: #ddd; margin-bottom: 1em;}

#messages { width: 690px; height: 300px; overflow: auto; background-color: #eee; margin-bottom: 1em; margin-right: 10px;}

Po dodaniu plików HTML i CSS mo esz uruchomi aplikacj w przegl darce interne-towej. Na obecnym etapie prac powinna wygl da jak na rysunku 2.9.

Aplikacja oczywi cie nie oferuje jeszcze pe nej funkcjonalno ci, ale pliki statyczne sudost pniane, a podstawowy uk ad graficzny prawid owo generowany. Przechodzimywi c teraz do przygotowania kodu dzia aj cego po stronie serwera i odpowiedzialnegoza obs ug wiadomo ci.

2.4. Obs uga wiadomo ci czatuza pomoc biblioteki Socket.IO

Z trzech wymaga stawianych budowanym aplikacjom omówili my dot d pierwsze, czyliudost pnianie plików statycznych. Przechodzimy teraz do drugiego — obs ugi komuni-kacji mi dzy przegl dark internetow i serwerem. Nowoczesne przegl darki interne-towe maj mo liwo u ycia technologii WebSocket do obs ugi komunikacji mi dzyprzegl dark i serwerem. (Dok adne informacje dotycz ce obs ugi WebSocket w prze-gl darkach internetowych znajdziesz na stronie http://socket.io/#browser-support).

Aplikacja b dzie mia a szeroko 800 pikseli i zostaniewy rodkowana poziomo.

Regu a CSS dla elementu, w którym wy wietlana jest nazwaaktualnego pokoju czatu.

Element wiadomo ci ma szeroko 690 pikseli i wysoko 300 pikseli.

Element <div> wy wietlaj cy wiadomo ci czatu b dzie móg byprzewijany, gdy wiadomo ci ca kowicie go wype ni .

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

2.4. Obs uga wiadomo ci czatu za pomoc biblioteki Socket.IO 47

Rysunek 2.9. Aplikacja czatu na obecnym etapie prac

WebSocket zapewnia warstw abstrakcji dla siebie oraz dla innych mechanizmówtransportu, zarówno dla Node, jak i kodu JavaScript dzia aj cego po stronie klienta.Biblioteka Socket.IO automatycznie zapewnia rozwi zania awaryjne, je li obs uga Web-Socket nie zosta a zaimplementowana w przegl darce internetowej. We wszystkichprzypadkach u ywane jest to samo API. W tym podrozdziale:

pokrótce poznasz bibliotek Socket.IO oraz zdefiniujesz funkcje Socket.IOniezb dne po stronie serwera;

dodasz kod odpowiedzialny za konfiguracj serwera Socket.IO; dodasz kod odpowiedzialny za obs ug ró nych zdarze czatu.

Biblioteka Socket.IO standardowo oferuje wirtualne kana y, wi c zamiast rozg aszaka d wiadomo do wszystkich po czonych u ytkowników, mo na j przekaza jedyniedo tych, którzy s subskrybentami danego kana u. Dzi ki tej funkcji implementacjapokoi czatu w budowanej tutaj aplikacji staje si naprawd atwym zadaniem, o czymsi wkrótce przekonasz.

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

48 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

Biblioteka Socket.IO to równie doskona y przyk ad u yteczno ci emiterów zdarze .Wspomniany emiter zdarze to w zasadzie u yteczny wzorzec organizacji logiki asyn-chronicznej. W tym rozdziale poznasz kod pewnych emiterów zdarze , ale tym tema-tem dok adnie zajmiemy si w nast pnym rozdziale.

Emiter zdarzePod wzgl dem koncepcji emiter zdarze jest powi zany z pewnego rodzaju zasobem, mo ewysy a i otrzymywa wiadomo ci do oraz z zasobu. Wspomnianym zasobem mo e bypo czenie ze zdalnym serwerem lub co znacznie bardziej abstrakcyjnego, na przyk adposta w grze. Projekt Johnny-Five (https://github.com/rwaldron/johnny-five) wykorzy-stuje Node w aplikacjach robotów i u ywa emiterów zdarze do kontrolowania mikrokon-trolerów Arduino.

W pierwszej kolejno ci trzeba uruchomi serwer i przygotowa logik odpowiedzialnza nawi zywanie po czenia. Nast pnie przyst pimy do zdefiniowania funkcji wyma-ganych po stronie serwera.

2.4.1. Konfiguracja serwera Socket.IO

Na pocz tku w pliku server.js nale y umie ci dwa podane poni ej wiersze kodu. Pierw-szy powoduje wczytanie funkcji ze wskazanego modu u Node dostarczaj cego logikpotrzebn do obs ugi po stronie serwera funkcji czatu zwi zanych z bibliotek Soc-ket.IO. Wskazany modu zdefiniujemy za chwil . Natomiast drugi wiersz uruchamiaserwer i dostarcza funkcje Socket.IO przy za o eniu, e mamy ju zdefiniowany serwerHTTP, co pozwala na wspó dzielenie tego samego portu TCP/IP:var chatServer = require('./lib/chat_server');chatServer.listen(server);

Teraz trzeba utworzy plik chat_server.js w podkatalogu lib. Na pocz tku w wymie-nionym pliku umie poni sze deklaracje zmiennych. Te deklaracje pozwol na u yciebiblioteki Socket.IO, a tak e inicjalizuj kilka zmiennych przeznaczonych do definio-wania stanu czatu:var socketio = require('socket.io');var io;var guestNumber = 1;var nickNames = {};var namesUsed = [];var currentRoom = {};

UTWORZENIE LOGIKI PO CZENIA

Kolejnym krokiem jest dodanie przedstawionej w listingu 2.7 logiki odpowiedzialnej zazdefiniowanie funkcji listen serwera czatu. Wymieniona funkcja jest wywo ywanaw pliku server.js. Powoduje uruchomienie serwera Socket.IO, ogranicza ilo danychwy wietlanych w konsoli przez bibliotek Socket.IO, a tak e definiuje sposób obs ugiwszystkich po cze przychodz cych.

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

2.4. Obs uga wiadomo ci czatu za pomoc biblioteki Socket.IO 49

Listing 2.7. Logika odpowiedzialna za uruchomienie serwera Socket.IO

exports.listen = function(server) {

io = socketio.listen(server);

io.set('log level', 1);

io.sockets.on('connection', function (socket) {

guestNumber = assignGuestName(socket, guestNumber, nickNames, namesUsed);

joinRoom(socket, 'Lobby');

handleMessageBroadcasting(socket, nickNames);

handleNameChangeAttempts(socket, nickNames, namesUsed);

handleRoomJoining(socket);

socket.on('rooms', function() {

socket.emit('rooms', io.sockets.manager.rooms);

});

handleClientDisconnection(socket, nickNames, namesUsed);

});

};

Jak mo esz zauwa y , logika obs ugi po czenia wywo uje wiele funkcji pomocniczych,które teraz trzeba b dzie zdefiniowa w pliku chat_server.js.

Po przygotowaniu logiki odpowiedzialnej za nawi zywanie po czenia trzeba zdefi-niowa kilka funkcji pomocniczych, które obs uguj inne funkcjonalno ci oferowaneprzez aplikacj .

2.4.2. Obs uga zdarze oraz scenariuszy w aplikacji

Aplikacja czatu musi zapewni obs ug wymienionych poni ej zdarze i rodzajówscenariuszy:

przypisanie nazwy go cia, danie zmiany pokoju, danie zmiany nazwy u ytkownika, wysy anie wiadomo ci czatu, tworzenie pokoju, roz czanie u ytkownika.

Do obs ugi wymienionych funkcji konieczne jest przygotowanie kilku dodatkowychfunkcji pomocniczych.

Uruchomienie serwera Socket.IO i umo liwieniemu wspó pracy z istniej cym serwerem HTTP.

Zdefiniowanie sposobu obs ugi po czeniau ytkownika.

Przypisanie u ytkownikowi nazwygo cia podczas nawi zywaniapo czenia.

Umieszczenie u ytkownika w pokoju Lobby, gdy próbuje onnawi za po czenie.

Obs uga wiadomo ciu ytkownika, prób zmiany nazwyu ytkownika, a tak e tworzenialub zmiany pokoju czatu.

Wy wietlenie u ytkownika wraz z list pokoi,w których prowadzi czat.

Zdefiniowanie logikiwykonywanej podczasroz czania u ytkownika.

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

50 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

PRZYPISANIE NAZWY GO CIA

Pierwsza funkcja pomocnicza, któr trzeba doda , nosi nazw assignGuestName() i jestodpowiedzialna za obs ug nadawania nazwy nowemu u ytkownikowi. Kiedy u ytkow-nik po raz pierwszy nawi zuje po czenie z serwerem czatu, zostaje umieszczonyw pokoju Lobby. Jednocze nie nast puje wywo anie funkcji assignGuestName() i przypi-sanie mu nazwy odró niaj cej nowego u ytkownika od pozosta ych.

Nazwa ka dego go cia to w zasadzie s owo Go , po którym znajduje si liczbao warto ci zwi kszanej po nawi zaniu po czenia przez ka dego kolejnego u ytkownika.Nazwa go cia jest przechowywana w zmiennej nickNames powi zanej z wewn trznymidentyfikatorem gniazda. Ponadto nazwa zostaje dodana do namesUsed, czyli zmiennejzawieraj cej u yte dot d nazwy u ytkowników. Implementacja funkcji assignGuestName()zosta a przedstawiona w listingu 2.8, dodaj j do pliku lib/chat_server.js.

Listing 2.8. Przypisanie nazwy go cia

function assignGuestName(socket, guestNumber, nickNames, namesUsed) { var name = 'Go ' + guestNumber; nickNames[socket.id] = name; socket.emit('nameResult', { success: true, name: name }); namesUsed.push(name); return guestNumber + 1;}

DO CZANIE DO POKOJU

Druga funkcja pomocnicza, któr trzeba doda do pliku chat_server.js, nosi nazwjoinRoom(). Kod wymienionej funkcji przedstawiono w listingu 2.9. Jest ona odpowie-dzialna za obs ug logiki zwi zanej z do czaniem u ytkownika do pokoju czatu.

Listing 2.9. Logika obs uguj ca do czanie do pokoju

function joinRoom(socket, room) { socket.join(room); currentRoom[socket.id] = room; socket.emit('joinResult', {room: room}); socket.broadcast.to(room).emit('message', { text: nickNames[socket.id] + ' do czy do pokoju ' + room + '.' });

var usersInRoom = io.sockets.clients(room); if (usersInRoom.length > 1) { var usersInRoomSummary = 'Lista u ytkowników w pokoju ' + room + ': '; for (var index in usersInRoom) { var userSocketId = usersInRoom[index].id; if (userSocketId != socket.id) { if (index > 0) { usersInRoomSummary += ', '; } usersInRoomSummary += nickNames[userSocketId]; }

Powi zanie nazwy go cia z identyfikatorem po czenia klienta.Wygenerowanie nowej nazwy go cia.

Podanie u ytkownikowi wygenerowanej dla niego nazwy.

Inkrementacja licznika u ywanego podczas generowania nazw go ci.Zwró uwag na u ycie nazwy go cia.

Do czenie uczestnikado pokoju.

Poinformowanie uczestnika, e znajdujesi we wskazanym pokoju.

Zauwa , e u ytkownikznajduje si w pokoju.

Poinformowaniepozosta ych uczestnikóww pokoju o do czeniunowego.

Ustalenie, czy jeszcze inni uczestnicyznajduj si w danym pokoju.

Je eli w pokoju s inni uczestnicy, aplikacja wy wietla ich liczb .

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

2.4. Obs uga wiadomo ci czatu za pomoc biblioteki Socket.IO 51

} usersInRoomSummary += '.'; socket.emit('message', {text: usersInRoomSummary}); }}

Dzi ki bibliotece Socket.IO do czenie uczestnika do pokoju czatu jest prost operacji wymaga jedynie wywo ania metody join obiektu socket. Nast pnie aplikacja podajeinformacje szczegó owe uczestnikowi oraz pozosta ym uczestnikom znajduj cym siw tym samym pokoju. Aplikacja podaje liczb osób znajduj cych si w pokoju czatu,a tak e informuje pozosta ych uczestników w pokoju o do czeniu nowego.

OBS UGA DA ZMIANY NAZWY U YTKOWNIKA

Je eli ka dy uczestnik zachowa przydzielon mu nazw go cia, wtedy trudno b dziepo apa si , kto jest kim. Dlatego te aplikacja czatu pozwala u ytkownikowi na zmianjego nazwy. Jak pokazano na rysunku 2.10, zmiana nazwy powoduje wykonanie przezprzegl dark internetow u ytkownika dania za pomoc Socket.IO, a nast pnie otrzy-manie odpowiedzi wskazuj cej na sukces lub niepowodzenie operacji.

Rysunek 2.10. danie zmiany nazwy u ytkownika i odpowied negatywna

W pliku lib/chat_server.js umie kod przedstawiony w listingu 2.10 zawieraj cy defini-cj funkcji odpowiedzialnej za obs ug da zmiany nazwy u ytkownika. Z perspek-tywy aplikacji u ytkownik nie mo e zmieni nazwy na rozpoczynaj c si od s owaGo lub b d cej ju w u yciu.

Listing 2.10. Logika odpowiedzialna za obs ug zmiany nazwy u ytkownika

function handleNameChangeAttempts(socket, nickNames, namesUsed) { socket.on('nameAttempt', function(name) { if (name.indexOf('Go ') == 0) { socket.emit('nameResult', { success: false, message: 'Nazwa u ytkownika nie mo e rozpoczyna si od s owa "Go ".' }); } else { if (namesUsed.indexOf(name) == -1) { var previousName = nickNames[socket.id];

Przekazanie nowemu uczestnikowipodsumowania o innychuczestnikach znajduj cych siw pokoju.

Dodanie funkcji nas uchuj cej zdarze nameAttempt.

Niedozwolone jest u ycie nazwy rozpoczynaj cejsi od s owa Go .

Je eli nazwa nie jest jeszczezarejestrowana, wtedy nale yj zarejestrowa .

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

52 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

var previousNameIndex = namesUsed.indexOf(previousName); namesUsed.push(name); nickNames[socket.id] = name; delete namesUsed[previousNameIndex]; socket.emit('nameResult', { success: true, name: name }); socket.broadcast.to(currentRoom[socket.id]).emit('message', { text: previousName + ' zmieni nazw na ' + name + '.' }); } else { socket.emit('nameResult', { success: false, message: 'Ta nazwa jest u ywana przez innego u ytkownika.' }); } } });}

WYSY ANIE WIADOMO CI CZATU

Kiedy zadbali my ju o nazwy u ytkowników, przechodzimy do dodania kolejnej funkcji.Odpowiada ona za obs ug sposobu wysy ania wiadomo ci czatu. Na rysunku 2.11 poka-zano podstaw dzia ania tego procesu: u ytkownik emituje zdarzenie wskazuj ce pokój,do którego ma zosta wys ana wiadomo , oraz jej tekst. Nast pnie serwer przekazujewiadomo do wszystkich uczestników czatu znajduj cych si w danym pokoju.

Rysunek 2.11. Wysy anie wiadomo ci czatu

Poni szy kod umie w pliku lib/chat_server.js. Do przekazywania wiadomo ci jestu ywana funkcja broadcast() biblioteki Socket.IO:function handleMessageBroadcasting(socket) { socket.on('message', function (message) { socket.broadcast.to(message.room).emit('message', {

Usuni cie poprzedniej nazwyu ytkownika i tym samymudost pnienie jej innym klientom.

Wygenerowanie b du, je li wybrana nazwajest ju u ywana przez innego u ytkownika.

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

2.4. Obs uga wiadomo ci czatu za pomoc biblioteki Socket.IO 53

text: nickNames[socket.id] + ': ' + message.text }); });}

TWORZENIE POKOJU

Kolejnym krokiem jest dodanie funkcji pozwalaj cej u ytkownikowi na do czenie doistniej cego pokoju czatu lub utworzenie nowego. Na rysunku 2.12 pokazano interakcjezachodz ce wówczas mi dzy u ytkownikiem i serwerem.

Rysunek 2.12. Przej cie do innego pokoju czatu

Poni szy kod umie w pliku lib/chat_server.js, umo liwiaj c tym samym zmian pokojuczatu. Zwró uwag na u ycie metody leave() biblioteki Socket.IO:function handleRoomJoining(socket) { socket.on('join', function(room) { socket.leave(currentRoom[socket.id]); joinRoom(socket, room.newRoom); });}

OBS UGA ROZ CZENIA U YTKOWNIKA

Do pliku lib/chat_server.js konieczne jest dodanie poni szego fragmentu kodu odpo-wiedzialnego za usuni cie nazwy u ytkownika ze zmiennych nickNames i namesUsed, gdyu ytkownik ko czy prac z aplikacj czatu:function handleClientDisconnection(socket) { socket.on('disconnect', function() { var nameIndex = namesUsed.indexOf(nickNames[socket.id]); delete namesUsed[nameIndex]; delete nickNames[socket.id]; });}

W ten sposób zako czyli my tworzenie komponentów dzia aj cych po stronie serwera.Teraz mo emy powróci do kontynuowania prac nad logik dzia aj c po stronieklienta.

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

54 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

2.5. U ycie kodu JavaScript dzia aj cego po stronie klientado utworzenia interfejsu u ytkownika aplikacji

Po dodaniu dzia aj cej po stronie serwera logiki Socket.IO do obs ugi wiadomo ci czatupora doda kod JavaScript dzia aj cy po stronie klienta i potrzebny do prowadzeniakomunikacji z serwerem. Wspomniany kod musi zapewni nast puj ce mo liwo ci:

wysy anie do serwera wiadomo ci oraz da zmiany pokoju lub nazwyu ytkownika;

wy wietlanie wiadomo ci pochodz cych od innych uczestników czatu orazlisty dost pnych pokoi.

Rozpoczniemy do implementacji pierwszej z wymienionych powy ej funkcji.

2.5.1. Przekazywanie do serwera wiadomo cioraz da zmiany pokoju lub nazwy u ytkownika

Pierwszym fragmentem kodu JavaScript dzia aj cego po stronie klienta jest prototypobiektu JavaScript, który b dzie przetwarza polecenia czatu, wysy a wiadomo ci oraz

dania zmiany pokoju lub nazwy u ytkownika.W katalogu public/javascripts utwórz plik o nazwie chat.js i umie w nim poni szy

fragment kodu. W j zyku JavaScript s u y on do zdefiniowania „klasy” pobieraj cej pod-czas tworzenia pojedynczy argument w postaci gniazda Socket.IO:var Chat = function(socket) { this.socket = socket;};

Nast pnie dodaj poni sz funkcj odpowiedzialn za wysy anie wiadomo ci:Chat.prototype.sendMessage = function(room, text) { var message = { room: room, text: text }; this.socket.emit('message', message);};

A teraz dodaj funkcj przeznaczon do obs ugi zmiany pokoju:Chat.prototype.changeRoom = function(room) { this.socket.emit('join', { newRoom: room });};

Na ko cu dodaj funkcj przedstawion w listingu 2.11 i przeznaczon do przetwarzaniapolece czatu. Rozpoznawane s dwa polecenia: join pozwalaj ce na do czenie si dopokoju lub utworzenie nowego oraz nick pozwalaj ce na zmian nazwy u ytkownika.

Listing 2.11. Funkcja przetwarzaj ca polecenia czatu

Chat.prototype.processCommand = function(command) { var words = command.split(' '); var command = words[0]

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

2.5.U ycie kodu JavaScript dzia aj cego po stronie klienta do utworzenia interfejsu u ytkownika aplikacji 55

.substring(1, words[0].length) .toLowerCase(); var message = false;

switch(command) { case 'join': words.shift(); var room = words.join(' '); this.changeRoom(room); break; case 'nick': words.shift(); var name = words.join(' '); this.socket.emit('nameAttempt', name); break; default: message = 'Nieznane polecenie.'; break; };

return message;};

2.5.2. Wy wietlenie w interfejsie u ytkownika wiadomo cii listy dost pnych pokoi

W tym punkcie zajmiemy si dodaniem logiki odpowiedzialnej za bezpo redni wspó -prac z opartym na przegl darce interfejsem u ytkownika za pomoc biblioteki jQuery.Pierwsza funkcja, nad któr b dziemy pracowa , s u y do wy wietlania danych tek-stowych.

Z perspektywy zapewnienia bezpiecze stwa w aplikacji sieciowej rozró niamy dwarodzaje danych tekstowych. Pierwszy to zaufane dane tekstowe, na które sk adaj sidane pochodz ce z aplikacji. Drugi to niezaufane dane tekstowe, które pochodz odu ytkownika lub powsta y na podstawie danych podanych przez u ytkownika. Danetekstowe pochodz ce od u ytkownika s uznawane za niezaufane, poniewa z o liwyu ytkownik mo e celowo umie ci w nich znaczniki <script> zawieraj ce logik w j zykuJavaScript. Je eli tak przygotowane dane b d w niezmodyfikowanej postaci wy wietloneinnym u ytkownikom, mog doprowadzi do wyst pienia niechcianych zdarze , naprzyk ad przekierowa u ytkownika na inn stron internetow . Taka metoda przechwy-cenia aplikacji sieciowej nosi nazw ataku XSS (Cross-Site Scripting).

Budowana przez nas aplikacja czatu u ywa dwóch funkcji pomocniczych do wy wie-tlania danych tekstowych. Pierwsza funkcja jest przeznaczona do wy wietlania niezaufa-nych danych tekstowych, natomiast druga do wy wietlania zaufanych danych tekstowych.

Funkcja divEscapedContentElement() wy wietla niezaufane dane tekstowe. Przepro-wadza operacj sprawdzenia tekstu i zmienia znaki specjalne na odpowiadaj ce im encjeHTML, jak pokazano na rysunku 2.13. W ten sposób przegl darka internetowa „wie”,jak wy wietli dany znak, i nie próbuje zinterpretowa go jako cz ci znacznika HTML.

Z kolei funkcja divSystemContentElement() jest przeznaczona do wy wietlania zaufanejtre ci wygenerowanej przez system, a nie przez innych u ytkowników.

Przetworzenie polecenia z listy s ów.

Obs uga operacji zmiany pokoju lub utworzenia nowego.

Obs uga operacji zmiany nazwy u ytkownika.

Je eli polecenie nie zostanie rozpoznane,wtedy nast pi wygenerowanie b du.

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

56 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

Rysunek 2.13.Unieszkodliwienieniebezpiecznychznaków

W katalogu public/javascripts utwórz plik o nazwie chat_ui.js i umie w nim poni szyfragment kodu zawieraj cy obie wymienione wcze niej funkcje pomocnicze:function divEscapedContentElement(message) { return $('<div></div>').text(message);}

function divSystemContentElement(message) { return $('<div></div>').html('<i>' + message + '</i>');}

Kolejna funkcja umieszczana w pliku chat_ui.js s u y do przetwarzania danych wej cio-wych u ytkownika, informacje o niej przedstawiono w listingu 2.12. Je eli dane wej cioweu ytkownika rozpoczynaj si od uko nika (/), b d potraktowane jako polecenie czatu.W przeciwnym razie zostan wys ane do serwera jako wiadomo czatu, a nast pnieprzekazane innym u ytkownikom i dodane do tekstu czatu pokoju, w którym aktualnieznajduje si u ytkownik.

Listing 2.12. Funkcja przetwarzaj ca niezmodyfikowane dane wej ciowe u ytkownika

function processUserInput(chatApp, socket) { var message = $('#send-message').val(); var systemMessage;

if (message.charAt(0) == '/') { systemMessage = chatApp.processCommand(message); if (systemMessage) { $('#messages').append(divSystemContentElement(systemMessage)); } } else { chatApp.sendMessage($('#room').text(), message); $('#messages').append(divEscapedContentElement(message)); $('#messages').scrollTop($('#messages').prop('scrollHeight')); }

$('#send-message').val('');}

Po przygotowaniu funkcji pomocniczych mo na przyst pi do dodania logiki przedsta-wionej w listingu 2.13. Ma ona zastosowanie, gdy strona internetowa zostanie w pe niwczytana w przegl darce internetowej u ytkownika. Kod listingu 2.13 jest odpowie-dzialny za inicjalizacj obs ugi zdarze Socket.IO.

Je eli dane wej ciowe uczestnika czaturozpoczynaj si od uko nika, nale ypotraktowa je jako polecenie czatu.

Dane wej ciowe inne ni poleceniaczatu nale y przekaza innymuczestnikom czatu.

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

2.5.U ycie kodu JavaScript dzia aj cego po stronie klienta do utworzenia interfejsu u ytkownika aplikacji 57

Listing 2.13. Dzia aj ca po stronie klienta logika inicjalizacji aplikacji

var socket = io.connect();

$(document).ready(function() { var chatApp = new Chat(socket);

socket.on('nameResult', function(result) { var message;

if (result.success) { message = 'Twoja nazwa u ytkownika to ' + result.name + '.'; } else { message = result.message; } $('#messages').append(divSystemContentElement(message)); });

socket.on('joinResult', function(result) { $('#room').text(result.room); $('#messages').append(divSystemContentElement('Pokój zosta zmieniony.')); });

socket.on('message', function (message) { var newElement = $('<div></div>').text(message.text); $('#messages').append(newElement); });

socket.on('rooms', function(rooms) { $('#room-list').empty();

for(var room in rooms) { room = room.substring(1, room.length); if (room != '') { $('#room-list').append(divEscapedContentElement(room)); } }

$('#room-list div').click(function() { chatApp.processCommand('/join ' + $(this).text()); $('#send-message').focus(); }); });

setInterval(function() { socket.emit('rooms'); }, 1000);

$('#send-message').focus();

$('#send-form').submit(function() { processUserInput(chatApp, socket); return false; });});

Wy wietlenie wyniku operacji zmianynazwy u ytkownika.

Wy wietlenie wyniku operacji zmiany pokoju.

Wy wietlenie otrzymanych wiadomo ci.

Wy wietlenie listy dost pnych pokoi.

Klikni cie nazwy pokoju powodujeprzej cie do niego.

danie pobrania od czasu do czasu listy dost pnych pokoi.

Wys anie formularza powoduje wys aniewiadomo ci czatu.

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

58 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

W celu zako czenia prac nad aplikacj nale y w pliku public/stylesheets/style.css umie-ci jeszcze style CSS przedstawione w listingu 2.14.

Listing 2.14. Ostatnie style, które trzeba doda do pliku style.css

#room-list { float: right; width: 100px; height: 300px; overflow: auto;}

#room-list div { border-bottom: 1px solid #eee;}

#room-list div:hover { background-color: #ddd;}

#send-message { width: 700px; margin-bottom: 1em; margin-right: 1em;}

#help { font: 10px "Lucida Grande", Helvetica, Arial, sans-serif;}

Po dodaniu ostatnich fragmentów kodu spróbuj uruchomi aplikacj (przez wydaniepolecenia node server.js). Powiniene otrzyma wynik pokazany na rysunku 2.14.

2.6. PodsumowanieW ten sposób za pomoc Node.js utworzy e ma aplikacj sieciow dzia aj c w czasierzeczywistym!

Na tym etapie powiniene ju wiedzie , jak konstruowane s aplikacje Node i jakwygl da ich kod ród owy. Je eli jakiekolwiek aspekty omówionej tutaj aplikacji nadalpozostaj dla Ciebie niezrozumia e, nie przejmuj si tym. W kolejnych rozdzia achjeszcze dok adniej zajmiemy si omówieniem technik i technologii zastosowanychw zbudowanej tutaj aplikacji czatu.

Jednak zanim przejdziemy dalej do programowania z u yciem Node, powinienedowiedzie si , jak rozwi zywa problemy charakterystyczne dla programowania asyn-chronicznego. W kolejnym rozdziale przedstawiono wi c podstawowe techniki i sztuczki,dzi ki którym zaoszcz dzisz sobie du ej ilo ci czasu i frustracji.

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

2.6. Podsumowanie 59

Rysunek 2.14. Uko czona aplikacja czatu

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

60 ROZDZIA 2. Tworzenie aplikacji wielopokojowego czatu

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

Skorowidz

AAjax

udost pnianie plików, 38Amazon Web Services, 344, 345ANSI, 388, 389API

Node, 29–32, 351–353REST, 270–277

aplikacjaasynchroniczna, 30Connect, 154Node, 35–60sieciowa w Node, 97–124

architekturamodel-widok-kontroler, 310MVC, 310

asercjaequal(), 288notEqual(), 289ok(), 289

asynchronicznooperacje wej cia-wyj cia, 24serwer oparty na zdarzeniach, 25–27

ataktypu t czowa tablica, 245XSS, 315

atrybuty znacznika w Jade, 328

BBasic Authentication, 161baza danych

nierelacyjna, 141–151relacyjna, 130–141

Bcrypt, 243BDD, 286biblioteka

should.js, 301–303Socket.IO, 356–363

b dtypu 404, 278, 279typu 500, 280–283

Browseling, 27, 28BSON, 148buforowanie

danych, 117szablonów EJS, 321widoku w aplikacji Express, 225

bufory, 363–365

Ccertyfikat w protokole HTTPS, 123CGI, 382ci g zaburzaj cy, 245closure, 83Connect, 153–176consolidate.js, 430, 431cookies

JSON, 181metody po rednicz ce, 179–182sesji, 198

CRUD, 102CSRF, 202cURL, 103

Ddane tekstowe, 55Data-Intensive Real-Time, Patrz DIRTdebugowanie Node, 421DIRT, 27–32dodanie modu u do repozytorium npm, 405–409domkni cie, 164

JavaScript, 83dyspozytor we frameworku Connect, 154dziedziczenie szablonu, 333–335

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

436 Skorowidz

EEC2, 344, 345EJS, 216, 223, 224, 314–322Elastic Compute Cloud, Patrz EC2emiter zdarze , 48

u ycie do do obs ugi powtarzaj cych sizdarze , 74–82

Express, 154, 213–240zaawansowane u ycie, 241–284

Express-Expose, 431Express-Resource, 431

Ffiltry EJS, 316–319Fleet, 346Forever, 347, 348formatowanie odpowiedzi JSON, 433formularze w aplikacji Express, 232–236framework

Connect, 153–176Express, 154, 213–240

konfiguracja zaawansowana, 432rozszerzenia, 429–432zaawansowane u ycie, 241–284

Mocha, 293–298nodeunit, 291, 292Soda, 305–307testowy, 286Tobi, 303–305Vows, 298–300

funkcjaadd(), 116app.locals(), 231, 232assignGuestName(), 50cp.exec(), 379, 380cp.fork(), 383, 384cp.form(), 379cp.spawn(), 379, 381divEscapedContentElement(), 55divSystemContentElement(), 55fs.watch(), 359, 377fs.watchFile(), 359, 377getRange(), 260http.createServer(), 99inherits(), 80joinRoom(), 50loadOrInitializeTaskArray(), 128net.connect(), 369

next(), 156, 158, 162notFound(), 116parse(), 107parseInt(), 107pipe(), 368readFile(), 89req.param(), 268require(), 65, 66res.error(), 251res.locals(), 231res.messages(), 251res.setHeader(), 179storeTasks(), 129url.parse(), 107use(), 157

funkcje synchroniczne w Node.js, 375

GGit, 398, 399GitHub, 398–405

HHogan.js, 322, 323hosting

aplikacji Node, 342–346plików statycznych, 353, 354

Iinspektor Node, 426, 427instalacja

frameworka Express, 216, 217Node

w systemie Linux, 414w systemie OS X, 411, 412w systemie Windows, 413, 414

integracja EJS w aplikacji, 320, 321interfejs REPL, 106IRC, 396

JJade, 326–337JavaScript

informacje ogólne, 22, 23w szablonach Jade, 331

JSHint, 421JSON, 23

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

Skorowidz 437

Kkana y Redis, 145katalog node_modules, 68klasa Socket, 366klucz prywatny w protokole HTTPS, 123kod Node

organizacja, 62–64kody b dów modu u fs, 377kolejno

bajtów, 365metod po rednicz cych, 158–160

kolekcje MongoDB, 146, 147kompilacja Node, 415, 416konstruktor Buffer, 363kontrola przep ywu, 84–92

równoleg a, 89–91szeregowa, 85–89

Llogika w szablonach Jade, 330–333

Mmagazyn danych, 126–130

oparty na plikach, 127–130sesji, 198, 199w pami ci, 126

mapa hash bazy Redis, 143mened er npm, 416–419metoda

app.configure(), 221app.render(), 223Buffer.byteLength(), 106listeners(), 79next(), 154, 155pipe(), 111query(), 136removeAllListeners(), 79res.download(), 239, 240res.end(), 100res.render(), 223, 228, 231, 232res.sendfile(), 238res.setHeader(), 101res.write(), 100server.listen(), 101setMaxListeners(), 79Stream#pipe(), 110String#slice(), 107test.expect(), 292watch(), 81

metody HTTP, 103metody po rednicz ce, 153–158, 257–59

admin(), 162basicAuth(), 178, 200–202bodyParser(), 178, 182–184charakterystyczne dla trasy, 263–266compress(), 178, 207–209cookieParser(), 178–182csrf(), 178, 202, 203director(), 178directory(), 209, 210do obs ugi stronicowania, 267errorHandler(), 175errorHandler(), 178, 203–205errorPage(), 176favicon(), 178, 191hello(), 157, 173kolejno , 158–160konfigurowalne, 164–170limit(), 178, 184–186logger(), 164, 166logger(), 178, 188–191methodOverride(), 178, 191–194obs uga b dów, 170–176pets(), 174query(), 178, 186, 187rewrite(), 169router(), 166–168session(), 178, 195–199static(), 178, 205–207users(), 174uwierzytelniania, 161vhost(), 178, 194, 195we frameworku Connect, 155, 177–211

middleware, 153Mocha, 293–298modu

ansi.js, 390assert, 287–290child_process, 379debug, 423filed, 378filesystem, 375–379formidable, 118–121

sprawdzanie post pu operacjiprzekazywania plików, 122

fs, 375–379fstream, 378hiredis-node, 146http, 99node-mongodb-native, 146

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

438 Skorowidz

modunode-postgres, 139querystring, 117

modu y Node, 63tworzenie, 64–68

modyfikacja odpowiedzi JSON, 433MongoDB, 146–149Mongoose, 149–151monkey patching, 68montowanie we frameworku Connect, 160–163Mustache, 322–326MVC, 310MySQL, 131–139

Nnag ówek

Content-Type, 114Content-Length, 106

nag ówki HTTP, 101nas uchiwania zdarze , 70, 74–82nazwy zdarze , 77negocjacja tre ci, 275, 276ngen, 407Nginx, 353nieblokuj ce operacje wej cia-wyj cia, 24, 25, 31niezaufane dane tekstowe, 55Nimble, 85, 91Node

hosting aplikacji, 342–346wdra anie aplikacji, 341–354

Node Package Manager, 416–419Node.js

informacje ogólne, 21–33Nodejitsu Forever, 347, 348nodeunit, 291, 292NoSQL, 141–151notacja du e O, 144

Oobiekt

Buffer, 104, 364ChildProcess, 381exports, 63, 67module.exports, 67process, 371–375

obiekty Stream, 387obs uga b dów

a emiter zdarze , 80serwera plików statycznych, 112–114

w aplikacji Express, 277–283we frameworku Connect, 170–176

obs uga HTTP i WebSocket w jednej aplikacji, 39obs uga przekazywania plików, 118–121opcje konfiguracyjne frameworka Express, 432open source, 393OpenSSL, 123organizacja szablonów Jade, 333–337

Ppartials, 325p tla zdarze , 24, 82plik package.json, 40, 406, 407pliki statyczne

udost pnianie, 108–114pobieranie zasobów w aplikacji Express, 237–240podkatalogi projektu Node, 406polecenie

case w Jade, 333express, 215, 218, 243include w Jade, 336mixin, 327

w Jade, 336, 337mocha, 294npm, 384sudo, 347, 414

PostgreSQL, 139–141potoki w Node, 111PRG, 251procesy potomne, 379–384programowanie

asynchroniczne, 69–83w Node, 61–93

protokó HTTPS, 122, 123Proxy, 353, 354przechowywanie danych aplikacji Node, 125–152przegl darka internetowa, 23, 24przekazywanie danych w aplikacji Express,

234–237przetwarzanie

argumentów podanych w pow oce, 385, 386danych przekazanych za pomoc formularza

sieciowego, 114–122pull request, 403

RRackspace Cloud, 345RDBMS, 130–141ReadableStream, 111

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

Skorowidz 439

Redis, 141–146REPL, 106replikacja synchroniczna, 139repozytorium

mened era npm, 64npm, 395

dodanie modu u, 405–409REST, 102routing, 166

we frameworku Express, 259–270rozwidlenie projektu, 403, 404

SSauce Labs, 307sekcja

lambda, 324Mustache, 323–325

sekwencja logiki asynchronicznej, 84–92Selenium, 306serwer

chmury, 343, 344dedykowany, 343plików statycznych, 42–45, 109–112Selenium, 306TCP w Node, 365–369VPS, 343wirtualny, 343

sesje, 195–199shoutbox, 241, 242sie typu TCP/IP

a Node, 363–371silnik szablonów

tworzenie silnika szablonów we framewrokExpress, 429, 430

silnik szablonów Embedded JavaScript, Patrz EJSsilniki szablonów HTML, 314–337Socket.IO, 38, 47, 356–363

konfiguracja serwera, 48, 49Soda, 305–307stos wywo a , 423stronicowanie we frameworku Express, 266–270strumieniowanie danych, 32Swig, 430sygna y w systemie UNIX, 374, 375system zarz dzania relacyjn baz danych, 130–141szablon

EJS, 314–322Jade, 326–337Mustache, 322–326w aplikacji sieciowej, 309–337

Ttabela hash bazy Redis, 143TCP/IP

a Node, 363–371TDD, 286techniki programowania asynchronicznego, 69–83Testling, 28testowanie aplikacji Node, 285–308testy

akceptacyjne, 286, 303–307funkcyjne, Patrz testy akceptacyjnejednostkowe, 286–303zautomatyzowane, 285

Tobi, 303–305token uwierzytelnienia, 202trasy rejestracji, 249tryb safe, 148tworzenie

aplikacji bloga, 311–314aplikacji Express, 215–240aplikacji sieciowej w Node, 97–124aplikacji typu shoutbox we frameworku

Express, 241–284klienta TCP, 369–371minimalnej aplikacji Socket.IO, 357–359modu u Node, 64–68narz dzi pow oki, 384–391podstawowego serwera plików statycznych,

42–45procesów zewn trznych, 379–384serwera HTTP, 44, 99–102serwera TCP, 365–369szablonów EJS, 315, 316us ugi sieciowej RESTful, 102–108w asnych filtrów EJS, 319

typ danych Buffer, 363–365typ MIME, 38, 42

Uudost pnianie

plików statycznych, 108–114plików za pomoc protoko u http w Node, 38,

39Upstart, 349–351us uga sieciowa RESTful, 102–108uwierzytelnianie

podstawowe, 161, 271u ytkowników w applikacji Express, 242–259

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

440 Skorowidz

VV8, 23Virtual Host, 194, 195VirtualBox, 342Vows, 298VPS, 343

Wwdra anie aplikacji Node

w rodowisku produkcyjnym, 341–354z repozytorium Git, 346, 347

WebSocket, 38, 39, 47, 356widoki aplikacji Express, 223–232w a ciwo

req.method, 103res.statusCode, 102

WritableStream, 111wspó bie no , 127wyciek zmiennej globalnej, 293wywo anie zwrotne, 70

do obs ugi zdarze jednorazowych, 71–74wzorzec REST, 102

XXcode, 411

Zzabezpieczanie aplikacji

dzi ki u yciu protoko u HTTPS, 122, 123zadania

równoleg e, 84szeregowe, 84

zale no aplikacji, 40, 41zaufane dane tekstowe, 55zbiór Redis, 144zdarzenia specjalne emitowane przez obiekt

proces, 373zdarzenie progress, 122zmienna

__dirname, 224magiczna, 109NODE_ENV, 171, 221NODE_PATH, 68root, 109

zmienne rodowiskowe, 372ustawienie, 221

znacznik <div>, 328znaczniki

Jade, 328, 329Mustache, 323, 324, 325

danieDELETE, 103

usuni cie zasobu, 107, 108GET, 103

pobieranie zasobów, 105, 106HTTP obs ugiwane przez serwer HTTP

w Node, 99, 100POST, 103

tworzenie zasobów, 103–105przekazania zmian, 403PUT, 103REST, 270

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