Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00455 006766 14291147 na godz. na dobę w sumie
Node.js w akcji - ebook/pdf
Node.js w akcji - ebook/pdf
Autor: , , , Liczba stron: 440
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-9681-9 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> javascript - programowanie
Porównaj ceny (książka, ebook, audiobook).

Poznaj potencjał Node.js!

JavaScript to jeden z niewielu języków programowania w historii, który wzbudzał i wciąż wzbudza tak wiele emocji. Na rynku pojawił się w 1995 roku i od tego czasu: a) był obecny tylko w przeglądarkach, b) był masowo blokowany i c) wieszczono jego koniec… aż do dnia dzisiejszego, kiedy ciężko sobie wyobrazić stronę WWW, która nie korzystałaby z jego możliwości. Współcześnie JavaScript zaczyna także odnosić sukces w aplikacjach działających po stronie serwera. Możesz sobie wyobrazić, że Twoje żądania po stronie serwera obsługuje JavaScript? Nie? Czas to zmienić!

Node.js to platforma, która zapewnia najwyższą wydajność dzięki wykorzystywaniu nieblokujących operacji I/O oraz asynchronicznego mechanizmu zdarzeń. Działa na bazie najwydajniejszego silnika obsługującego język JavaScript – V8 (autorstwa firmy Google) – i pozwala programistom osiągać niezwykłe efekty. Zastanawiasz się, jak wykorzystać ten potencjał? Sięgnij po tę książkę i rozpocznij przygodę z Node.js! W trakcie lektury poznasz podstawy programowania na tej platformie, zbudujesz asynchroniczną logikę, wykorzystasz protokoły sieciowe oraz podłączysz się do popularnych baz danych. W kolejnych rozdziałach będziesz mieć niepowtarzalną okazję, by poznać popularne i przydatne biblioteki oraz stworzyć RESTowe API. Na sam koniec dowiesz się, jak wdrożyć aplikację Node.js w środowisku produkcyjnym oraz zaznajomisz się z ekosystemem tej platformy. Brzmi zachęcająco?

Dzięki tej książce:

Twój przewodnik po Node.js!
 


 

„Materiał przedstawiony w książce został dobrany w taki sposób, aby stopniowo przechodzić od najprostszych zagadnień do coraz bardziej złożonych i zaawansowanych.”

Ze wstępu do książki, napisanego przez Isaaca Z. Schluetera, lidera projektu Node.js

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

Darmowy fragment publikacji:

Tytuł oryginału: Node.js in Action Tłumaczenie: Robert Górczyński Projekt okładki: Studio Gravite/Olsztyn Obarek, 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 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/nodejs.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/nodejs 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(cid:258)ci Wst(cid:218)p 11 Przedmowa 13 Podzi(cid:218)kowania 15 O ksi(cid:200)(cid:285)ce 17 CZ(cid:125)(cid:165)(cid:109) I. PODSTAWY NODE 19 Rozdzia(cid:239) 1. Witamy w Node.js 21 1.1. Node jest zbudowane w oparciu o JavaScript 22 1.2. Asynchroniczna i oparta na zdarzeniach: przegl(cid:200)darka internetowa 23 1.3. Asynchroniczny i oparty na zdarzeniach: serwer 25 1.4. Aplikacje DIRT 27 1.5. Domy(cid:258)lna aplikacja jest typu DIRT 29 1.5.1. Prosty przyk(cid:239)ad aplikacji asynchronicznej 30 1.5.2. Serwer HTTP 30 1.5.3. Strumieniowanie danych 32 1.6. Podsumowanie 33 Rozdzia(cid:239) 2. Tworzenie aplikacji wielopokojowego czatu 35 2.1. Ogólny opis aplikacji 36 2.2. Wymagania aplikacji i konfiguracja pocz(cid:200)tkowa 38 2.2.1. Obs(cid:239)uga HTTP i WebSocket 39 2.2.2. Tworzenie struktury plików aplikacji 39 2.2.3. Wskazanie zale(cid:285)no(cid:258)ci 40 2.2.4. Instalacja zale(cid:285)no(cid:258)ci 41 2.3. Udost(cid:218)pnianie plików HTML, CSS i kodu JavaScript dzia(cid:239)aj(cid:200)cego po stronie klienta 41 2.3.1. Tworzenie podstawowego serwera plików statycznych 42 2.3.2. Dodanie plików HTML i CSS 45 2.4. Obs(cid:239)uga wiadomo(cid:258)ci czatu za pomoc(cid:200) biblioteki Socket.IO 46 2.4.1. Konfiguracja serwera Socket.IO 48 2.4.2. Obs(cid:239)uga zdarze(cid:241) oraz scenariuszy w aplikacji 49 2.5. U(cid:285)ycie kodu JavaScript dzia(cid:239)aj(cid:200)cego po stronie klienta do utworzenia i listy dost(cid:218)pnych pokoi 55 2.6. Podsumowanie 58 interfejsu u(cid:285)ytkownika aplikacji 54 2.5.1. Przekazywanie do serwera wiadomo(cid:258)ci oraz (cid:285)(cid:200)da(cid:241) zmiany pokoju lub nazwy u(cid:285)ytkownika 54 2.5.2. Wy(cid:258)wietlenie w interfejsie u(cid:285)ytkownika wiadomo(cid:258)ci Kup książkęPoleć książkę 4 Spis tre(cid:258)ci Rozdzia(cid:239) 3. Podstawy programowania w Node 61 3.1. Organizacja i wielokrotne u(cid:285)ycie kodu Node 62 3.1.1. Tworzenie modu(cid:239)u 64 3.1.2. Dostrajanie tworzenia modu(cid:239)u za pomoc(cid:200) module.exports 66 3.1.3. Wielokrotne u(cid:285)ycie modu(cid:239)ów za pomoc(cid:200) katalogu node_modules 68 3.1.4. Zastrze(cid:285)enia 68 3.2. Techniki programowania asynchronicznego 69 3.2.1. U(cid:285)ycie wywo(cid:239)a(cid:241) zwrotnych do obs(cid:239)ugi zdarze(cid:241) jednorazowych 71 3.2.2. U(cid:285)ycie emitera zdarze(cid:241) do obs(cid:239)ugi powtarzaj(cid:200)cych si(cid:218) zdarze(cid:241) 74 3.2.3. Wyzwania pojawiaj(cid:200)ce si(cid:218) podczas programowania asynchronicznego 82 3.3. Sekwencja logiki asynchronicznej 84 3.3.1. Kiedy stosowa(cid:202) szeregow(cid:200) kontrol(cid:218) przep(cid:239)ywu? 85 3.3.2. Implementacja szeregowej kontroli przep(cid:239)ywu 86 3.3.3. Implementacja równoleg(cid:239)ej kontroli przep(cid:239)ywu 89 3.3.4. U(cid:285)ycie narz(cid:218)dzi opracowanych przez spo(cid:239)eczno(cid:258)(cid:202) 91 3.4. Podsumowanie 92 CZ(cid:125)(cid:165)(cid:109) II. TWORZENIE APLIKACJI SIECIOWYCH W NODE 95 Rozdzia(cid:239) 4. Tworzenie aplikacji sieciowej w Node 97 4.1. Podstawy dotycz(cid:200)ce serwera HTTP 99 4.1.1. Jak przychodz(cid:200)ce (cid:285)(cid:200)dania HTTP s(cid:200) przez Node przedstawiane programi(cid:258)cie? 99 4.1.2. Prosty serwer HTTP odpowiadaj(cid:200)cy komunikatem „Witaj, (cid:258)wiecie” 100 4.1.3. Odczyt nag(cid:239)ówków (cid:285)(cid:200)dania i zdefiniowanie nag(cid:239)ówków odpowiedzi 101 4.1.4. Ustawienie kodu stanu odpowiedzi HTTP 102 4.2. Tworzenie us(cid:239)ugi sieciowej RESTful 102 4.2.1. Tworzenie zasobów za pomoc(cid:200) (cid:285)(cid:200)da(cid:241) POST 103 4.2.2. Pobieranie zasobów za pomoc(cid:200) (cid:285)(cid:200)dania GET 105 4.2.3. Usuni(cid:218)cie zasobu za pomoc(cid:200) (cid:285)(cid:200)dania DELETE 107 4.3. Udost(cid:218)pnianie plików statycznych 108 4.3.1. Tworzenie serwera plików statycznych 109 4.3.2. Obs(cid:239)uga b(cid:239)(cid:218)dów serwera 112 4.3.3. Wyprzedzaj(cid:200)ca obs(cid:239)uga b(cid:239)(cid:218)dów za pomoc(cid:200) wywo(cid:239)ania fs.stat() 113 4.4. Akceptacja danych wej(cid:258)ciowych u(cid:285)ytkownika przekazanych za pomoc(cid:200) formularza sieciowego 114 4.4.1. Obs(cid:239)uga wys(cid:239)anych pól formularza sieciowego 114 4.4.2. Obs(cid:239)uga przekazanych plików za pomoc(cid:200) formidable 118 4.4.3. Sprawdzanie post(cid:218)pu operacji przekazywania plików 122 Zabezpieczanie aplikacji dzi(cid:218)ki u(cid:285)yciu protoko(cid:239)u HTTPS 122 Podsumowanie 124 4.5. 4.6. Rozdzia(cid:239) 5. Przechowywanie danych aplikacji Node 125 5.1. Niewymagaj(cid:200)cy serwera magazyn danych 126 5.1.1. Magazyn danych w pami(cid:218)ci 126 5.1.2. Magazyn danych oparty na plikach 127 Kup książkęPoleć książkę Spis tre(cid:258)ci 5 5.2. System zarz(cid:200)dzania relacyjn(cid:200) baz(cid:200) danych 130 5.2.1. MySQL 131 5.2.2. PostgreSQL 139 5.3. Bazy danych typu NoSQL 141 5.3.1. Redis 141 5.3.2. MongoDB 146 5.3.3. Mongoose 149 5.4. Podsumowanie 151 Rozdzia(cid:239) 6. Framework Connect 153 6.1. Konfiguracja aplikacji Connect 154 6.2. Jak dzia(cid:239)a metoda po(cid:258)rednicz(cid:200)ca frameworka Connect? 155 6.2.1. Metody po(cid:258)rednicz(cid:200)ce wy(cid:258)wietlaj(cid:200)ce (cid:285)(cid:200)danie 156 6.2.2. Metoda po(cid:258)rednicz(cid:200)ca udzielaj(cid:200)ca odpowiedzi w postaci komunikatu „Witaj, (cid:258)wiecie” 157 6.3. Dlaczego kolejno(cid:258)(cid:202) metod po(cid:258)rednicz(cid:200)cych ma znaczenie? 158 6.3.1. Kiedy metoda po(cid:258)rednicz(cid:200)ca nie wywo(cid:239)uje next()? 158 6.3.2. U(cid:285)ycie kolejno(cid:258)ci metod po(cid:258)rednicz(cid:200)cych do przeprowadzenia uwierzytelnienia 159 6.4. Montowanie metody po(cid:258)rednicz(cid:200)cej i serwera 160 6.4.1. Metody po(cid:258)rednicz(cid:200)ce przeprowadzaj(cid:200)ce uwierzytelnianie 161 6.4.2. Metoda po(cid:258)rednicz(cid:200)ca wy(cid:258)wietlaj(cid:200)ca panel administracyjny 162 6.5. Tworzenie konfigurowalnej metody po(cid:258)rednicz(cid:200)cej 164 6.5.1. Tworzenie konfigurowalnej metody po(cid:258)rednicz(cid:200)cej logger() 164 6.5.2. Tworzenie metody po(cid:258)rednicz(cid:200)cej router() 166 6.5.3. Tworzenie metody po(cid:258)rednicz(cid:200)cej przeznaczonej do przepisywania adresów URL 168 6.6. U(cid:285)ycie metody po(cid:258)rednicz(cid:200)cej do obs(cid:239)ugi b(cid:239)(cid:218)dów 170 6.6.1. Domy(cid:258)lna obs(cid:239)uga b(cid:239)(cid:218)dów w Connect 170 6.6.2. Samodzielna obs(cid:239)uga b(cid:239)(cid:218)dów aplikacji 171 6.6.3. U(cid:285)ycie wielu metod po(cid:258)rednicz(cid:200)cych przeznaczonych do obs(cid:239)ugi b(cid:239)(cid:218)dów 172 6.7. Podsumowanie 176 Rozdzia(cid:239) 7. Metody po(cid:258)rednicz(cid:200)ce frameworka Connect 177 7.1. Metody po(cid:258)rednicz(cid:200)ce przeznaczone do przetwarzania plików cookie, danych (cid:285)(cid:200)da(cid:241) i ci(cid:200)gów tekstowych zapyta(cid:241) 179 7.1.1. cookieParser() — przetwarzanie plików cookie 179 7.1.2. bodyParser() — przetwarzanie danych (cid:285)(cid:200)dania 182 7.1.3. limit() — ograniczenie danych (cid:285)(cid:200)dania 184 7.1.4. query() — analizator ci(cid:200)gu tekstowego zapytania 186 7.2. Metody po(cid:258)rednicz(cid:200)ce implementuj(cid:200)ce podstawowe funkcje wymagane przez aplikacj(cid:218) sieciow(cid:200) 187 7.2.1. logger() — rejestracja informacji o (cid:285)(cid:200)daniu 188 7.2.2. favicon() — obs(cid:239)uga ikon favicon 191 7.2.3. methodOverride() — nieprawdziwe metody HTTP 191 7.2.4. vhost() — wirtualny hosting 194 7.2.5. session() — zarz(cid:200)dzanie sesj(cid:200) 195 Kup książkęPoleć książkę 6 Spis tre(cid:258)ci 7.3. Metody po(cid:258)rednicz(cid:200)ce zapewniaj(cid:200)ce bezpiecze(cid:241)stwo aplikacji sieciowej 200 7.3.1. basicAuth() — uwierzytelnianie podstawowe HTTP 200 7.3.2. csrf() — ochrona przed atakami typu CSRF 202 7.3.3. errorHandler() — obs(cid:239)uga b(cid:239)(cid:218)dów w trakcie tworzenia aplikacji 203 7.4. Metody po(cid:258)rednicz(cid:200)ce przeznaczone do udost(cid:218)pniania plików statycznych 205 7.4.1. static() — udost(cid:218)pnianie plików statycznych 205 7.4.2. compress() — kompresja plików statycznych 207 7.4.3. directory() — wy(cid:258)wietlenie katalogów 209 7.5. Podsumowanie 210 Rozdzia(cid:239) 8. Framework Express 213 8.1. Utworzenie szkieletu aplikacji 215 8.1.1. Globalna instalacja frameworka Express 216 8.1.2. Generowanie aplikacji 218 8.1.3. Poznawanie aplikacji 218 8.2. Konfiguracja frameworka Express i tworzonej aplikacji 220 8.2.1. Konfiguracja na podstawie (cid:258)rodowiska 221 8.3. Generowanie widoków aplikacji Express 223 8.3.1. Konfiguracja systemu widoków 224 8.3.2. Wyszukiwanie widoku 225 8.3.3. Udost(cid:218)pnianie danych widokom 228 8.4. Obs(cid:239)uga formularzy i przekazywania plików 232 8.4.1. Implementacja modelu zdj(cid:218)cia 233 8.4.2. Tworzenie formularza przeznaczonego do przekazywania zdj(cid:218)(cid:202) 233 8.4.3. Wy(cid:258)wietlenie listy przekazanych zdj(cid:218)(cid:202) 236 8.5. Obs(cid:239)uga pobierania zasobów 237 8.5.1. Tworzenie trasy dla pobierania zdj(cid:218)(cid:202) 237 8.5.2. Implementacja trasy pobierania zdj(cid:218)cia 238 8.6. Podsumowanie 240 Rozdzia(cid:239) 9. Zaawansowane u(cid:285)ycie frameworka Express 241 9.1. Uwierzytelnianie u(cid:285)ytkowników 242 9.1.1. Zapisywanie i wczytywanie u(cid:285)ytkowników 243 9.1.2. Rejestrowanie nowego u(cid:285)ytkownika 248 9.1.3. Logowanie zarejestrowanych u(cid:285)ytkowników 254 9.1.4. Metoda po(cid:258)rednicz(cid:200)ca przeznaczona do wczytywania u(cid:285)ytkownika 257 9.2. Zaawansowane techniki routingu 259 9.2.1. Weryfikacja u(cid:285)ytkownika podczas przesy(cid:239)ania tre(cid:258)ci 260 9.2.2. Metoda po(cid:258)rednicz(cid:200)ca charakterystyczna dla trasy 263 9.2.3. Implementacja stronicowania 266 9.3. Utworzenie publicznego API REST 270 9.3.1. Projekt API 270 9.3.2. Dodanie uwierzytelnienia podstawowego 271 9.3.3. Implementacja routingu 272 9.3.4. W(cid:239)(cid:200)czenie negocjacji tre(cid:258)ci 275 9.4. Obs(cid:239)uga b(cid:239)(cid:218)dów 277 9.4.1. Obs(cid:239)uga b(cid:239)(cid:218)dów 404 278 9.4.2. Obs(cid:239)uga b(cid:239)(cid:218)dów 280 9.5. Podsumowanie 283 Kup książkęPoleć książkę Spis tre(cid:258)ci 7 Rozdzia(cid:239) 10. Testowanie aplikacji Node 285 10.1. Testy jednostkowe 286 10.1.1. Modu(cid:239) assert 287 10.1.2. Framework nodeunit 291 10.1.3. Mocha 293 10.1.4. Framework Vows 298 10.1.5. Biblioteka should.js 301 10.2. Testy akceptacyjne 303 10.2.1. Tobi 303 10.2.2. Soda 305 10.3. Podsumowanie 307 Rozdzia(cid:239) 11. Szablony w aplikacji sieciowej 309 11.1. U(cid:285)ycie szablonów w celu zachowania przejrzysto(cid:258)ci kodu 310 11.1.1. Szablon w akcji 311 11.2. Silnik szablonów Embedded JavaScript 314 11.2.1. Tworzenie szablonu 315 11.2.2. Praca z danymi szablonu za pomoc(cid:200) filtrów EJS 316 11.2.3. Integracja EJS w aplikacji 320 11.2.4. U(cid:285)ycie EJS w aplikacjach dzia(cid:239)aj(cid:200)cych po stronie klienta 321 11.3. U(cid:285)ycie j(cid:218)zyka szablonów Mustache wraz z silnikiem Hogan 322 11.3.1. Tworzenie szablonu 322 11.3.2. Znaczniki Mustache 323 11.3.3. Dostosowanie szablonu Hogan do w(cid:239)asnych potrzeb 325 11.4. Szablony Jade 326 11.4.1. Podstawy szablonów Jade 328 11.4.2. Logika w szablonach Jade 330 11.4.3. Organizacja szablonów Jade 333 11.5. Podsumowanie 337 CZ(cid:125)(cid:165)(cid:109) III. CO DALEJ? 339 Rozdzia(cid:239) 12. Wdra(cid:285)anie aplikacji Node i zapewnienie bezawaryjnego dzia(cid:239)ania 341 12.1. Hosting aplikacji Node 342 12.1.1. Serwery dedykowane i VPS 343 12.1.2. Hosting w chmurze 343 12.2. Podstawy wdro(cid:285)enia 346 12.2.1. Wdro(cid:285)enie z repozytorium Git 346 12.2.2. Zapewnienie dzia(cid:239)ania aplikacji Node 347 12.3. Maksymalizacja wydajno(cid:258)ci i czasu bezawaryjnego dzia(cid:239)ania aplikacji 348 12.3.1. Zapewnienie dzia(cid:239)ania aplikacji za pomoc(cid:200) Upstart 349 12.3.2. API klastra (cid:127) wykorzystanie zalety w postaci wielu rdzeni 351 12.3.3. Proxy i hosting plików statycznych 353 12.4. Podsumowanie 354 Kup książkęPoleć książkę 8 Spis tre(cid:258)ci Rozdzia(cid:239) 13. Nie tylko serwery WWW 355 13.1. Biblioteka Socket.IO 356 13.1.1. Tworzenie minimalnej aplikacji Socket.IO 357 13.1.2. U(cid:285)ycie biblioteki Socket.IO do od(cid:258)wie(cid:285)enia strony i stylów CSS 359 13.1.3. Inne zastosowania dla biblioteki Socket.IO 362 13.2. Dok(cid:239)adniejsze omówienie sieci TCP/IP 363 13.2.1. Praca z buforami i danymi binarnymi 363 13.2.2. Tworzenie serwera TCP 365 13.2.3. Tworzenie klienta TCP 369 13.3. Narz(cid:218)dzia przeznaczone do pracy z systemem operacyjnym 371 13.3.1. Obiekt process, czyli globalny wzorzec Singleton 371 13.3.2. U(cid:285)ycie modu(cid:239)u filesystem 375 13.3.3. Tworzenie procesów zewn(cid:218)trznych 379 13.4. Tworzenie narz(cid:218)dzi pow(cid:239)oki 384 13.4.1. Przetwarzanie argumentów podanych w pow(cid:239)oce 385 13.4.2. Praca ze standardowym wej(cid:258)ciem i wyj(cid:258)ciem 386 13.4.3. Dodanie koloru do danych wyj(cid:258)ciowych 388 13.5. Podsumowanie 391 Rozdzia(cid:239) 14. Ekosystem Node 393 14.1. Dost(cid:218)pne w internecie zasoby dla programistów Node 394 14.1.1. Node i odniesienia do modu(cid:239)ów 394 14.1.2. Grupy Google 395 14.1.3. IRC 396 14.1.4. Zg(cid:239)aszanie problemów w serwisie GitHub 397 14.2. Serwis GitHub 398 14.2.1. Rozpocz(cid:218)cie pracy z GitHub 398 14.2.2. Dodanie projektu do GitHub 399 14.2.3. Wspó(cid:239)praca przez serwis GitHub 403 14.3. Przekazanie w(cid:239)asnego modu(cid:239)u do repozytorium npm 405 14.3.1. Przygotowanie pakietu 406 14.3.2. Przygotowanie specyfikacji pakietu 406 14.3.3. Testowanie i publikowanie pakietu 407 14.4. Podsumowanie 409 Dodatek A. Instalacja Node i dodatki opracowane przez spo(cid:239)eczno(cid:258)(cid:202) 411 A.1. A.2. A.3. Instalacja w systemie OS X 411 A.1.1. Instalacja za pomoc(cid:200) Homebrew 412 Instalacja w systemie Windows 413 Instalacja w systemie Linux 414 A.3.1. Przygotowania do instalacji w Ubuntu 414 A.3.2. Przygotowania do instalacji w CentOS 415 A.4. Kompilacja Node 415 A.5. U(cid:285)ywanie mened(cid:285)era pakietów Node 416 A.5.1. Wyszukiwanie pakietów 417 A.5.2. Instalacja pakietu 418 A.5.3. Przegl(cid:200)danie dokumentacji i kodu pakietu 419 Kup książkęPoleć książkę Spis tre(cid:258)ci 9 Dodatek B. Debugowanie Node 421 B.1. Analiza kodu za pomoc(cid:200) JSHint 421 B.2. Dane wyj(cid:258)ciowe debugowania 422 B.2.1. Debugowanie za pomoc(cid:200) modu(cid:239)u console 422 B.2.2. U(cid:285)ycie modu(cid:239)u debug do zarz(cid:200)dzania danymi wyj(cid:258)ciowymi procesu debugowania 423 B.3. Debuger wbudowany w Node 424 B.3.1. Nawigacja po debugerze 424 B.3.2. Analiza i zmiana stanu w debugerze 425 Inspektor Node 426 B.4.1. Uruchomienie inspektora Node 426 B.4.2. Nawigacja po inspektorze Node 426 B.4.3. Przegl(cid:200)danie stanu w inspektorze Node 427 B.4. Dodatek C. Rozszerzenie i konfiguracja frameworka Express 429 C.1. Rozszerzenie frameworka Express 429 C.1.1. Rejestracja szablonów silników 429 C.1.2. Szablony i projekt consolidate.js 430 C.1.3. Frameworki i rozszerzenia Express 431 C.2. Konfiguracja zaawansowana 432 C.2.1. Modyfikacja odpowiedzi JSON 433 C.2.2. Formatowanie odpowiedzi JSON 433 Skorowidz 435 Kup książkęPoleć książkę 10 Spis tre(cid:258)ci Kup książkęPoleć książkę Tworzenie aplikacji wielopokojowego czatu W tym rozdziale: (cid:81) Pierwsze spojrzenie na ró(cid:298)ne komponenty Node. (cid:81) Przyk(cid:225)ad aplikacji Node dzia(cid:225)aj(cid:261)cej w czasie rzeczywistym. (cid:81) Wspó(cid:225)praca mi(cid:266)dzy klientem i serwerem. W rozdziale 1. dowiedzia(cid:239)e(cid:258) si(cid:218), jak programowanie asynchroniczne z u(cid:285)yciem Node ró(cid:285)ni si(cid:218) od konwencjonalnego programowania synchronicznego. W tym rozdziale wyko- rzystamy platform(cid:218) Node w praktyce do utworzenia ma(cid:239)ej, opartej na zdarzeniach apli- kacji czatu. Nie przejmuj si(cid:218), je(cid:258)li nie zrozumiesz ca(cid:239)ego materia(cid:239)u przedstawionego w rozdziale. Naszym celem jest obja(cid:258)nienie sposobu programowania z u(cid:285)yciem Node i jedynie zaprezentowanie mo(cid:285)liwo(cid:258)ci, jakie b(cid:218)dziesz mie(cid:202) po zako(cid:241)czeniu lektury niniejszej ksi(cid:200)(cid:285)ki. W rozdziale przyj(cid:218)to za(cid:239)o(cid:285)enie, (cid:285)e masz do(cid:258)wiadczenie w programowaniu aplikacji sieciowych, a tak(cid:285)e podstawow(cid:200) wiedz(cid:218) z zakresu HTTP i biblioteki jQuery. W trakcie lektury materia(cid:239)u przedstawionego w tym rozdziale: (cid:81) poznasz tworzon(cid:200) aplikacj(cid:218) i zobaczysz, jak dzia(cid:239)a; (cid:81) poznasz technologie wymagane do jej utworzenia i przeprowadzisz pocz(cid:200)tkow(cid:200) (cid:81) przygotujesz dla aplikacji kod HTML, CSS i JavaScript dzia(cid:239)aj(cid:200)cy po stronie konfiguracj(cid:218) aplikacji; klienta; Kup książkęPoleć książkę 36 ROZDZIA(cid:224) 2. Tworzenie aplikacji wielopokojowego czatu (cid:81) zajmiesz si(cid:218) obs(cid:239)ug(cid:200) wiadomo(cid:258)ci czatu za pomoc(cid:200) biblioteki Socket.IO; (cid:81) za pomoc(cid:200) kodu JavaScript dzia(cid:239)aj(cid:200)cego po stronie klienta przygotujesz interfejs u(cid:285)ytkownika aplikacji. Zaczynamy od ogólnego omówienia aplikacji — dowiesz si(cid:218), jak aplikacja b(cid:218)dzie wygl(cid:200)- da(cid:202) i dzia(cid:239)a(cid:202), gdy zako(cid:241)czymy proces jej tworzenia. 2.1. Ogólny opis aplikacji Aplikacja tworzona w tym rozdziale pozwala u(cid:285)ytkownikom na prowadzenie mi(cid:218)dzy sob(cid:200) internetowego czatu przez wprowadzanie wiadomo(cid:258)ci w prostym formularzu, jak pokazano na rysunku 2.1. Wprowadzona w formularzu wiadomo(cid:258)(cid:202) zostaje wys(cid:239)ana wszystkim uczestnikom czatu znajduj(cid:200)cym si(cid:218) w tym samym pokoju. Rysunek 2.1. Wprowadzenie wiadomo(cid:286)ci w aplikacji czatu Po uruchomieniu aplikacji u(cid:285)ytkownikowi automatycznie b(cid:218)dzie przypisana nazwa go(cid:258)cia, któr(cid:200) mo(cid:285)e zmieni(cid:202) przez wydanie polecenia, jak pokazano na rysunku 2.2. Polecenia czatu s(cid:200) poprzedzane uko(cid:258)nikiem (/). Rysunek 2.2. Zmiana nazwy u(cid:298)ytkownika czatu Kup książkęPoleć książkę 2.1. Ogólny opis aplikacji 37 Podobnie u(cid:285)ytkownik mo(cid:285)e wyda(cid:202) polecenie utworzenia nowego pokoju czatu (lub do(cid:239)(cid:200)- czenia do istniej(cid:200)cego), co pokazano na rysunku 2.3. Podczas tworzenia pokoju czatu nazwa nowego pokoju b(cid:218)dzie wy(cid:258)wietlana na poziomym pasku znajduj(cid:200)cym si(cid:218) na górze aplikacji czatu. Sam pokój zostanie równie(cid:285) umieszczony na li(cid:258)cie dost(cid:218)pnych pokoi wy(cid:258)wietlanej po prawej stronie obszaru wiadomo(cid:258)ci. Po przej(cid:258)ciu u(cid:285)ytkownika do nowego pokoju system potwierdzi t(cid:218) zmian(cid:218), jak poka- zano na rysunku 2.4. Rysunek 2.3. Zmiana pokoju czatu Rysunek 2.4. Wynik przej(cid:286)cia do nowego pokoju czatu Kup książkęPoleć książkę 38 ROZDZIA(cid:224) 2. Tworzenie aplikacji wielopokojowego czatu Wprawdzie funkcjonalno(cid:258)(cid:202) omawianej tutaj aplikacji bez w(cid:200)tpienia jest bardzo ogra- niczona, ale jednocze(cid:258)nie prezentuje ona wa(cid:285)ne i podstawowe koncepcje wymagane do utworzenia aplikacji sieciowej dzia(cid:239)aj(cid:200)cej w czasie rzeczywistym. Omawiania aplikacji pokazuje, jak Node mo(cid:285)e oferowa(cid:202) dane HTTP (na przyk(cid:239)ad pliki statyczne) i jednocze- (cid:258)nie obs(cid:239)ugiwa(cid:202) dane w czasie rzeczywistym (wiadomo(cid:258)ci czatu). Ponadto dzi(cid:218)ki oma- wianej aplikacji mo(cid:285)esz si(cid:218) przekona(cid:202), jak zorganizowane s(cid:200) aplikacje Node i jak wygl(cid:200)da zarz(cid:200)dzanie zale(cid:285)no(cid:258)ciami. Teraz przejdziemy do technologii wymaganych do implementacji aplikacji czatu. 2.2. Wymagania aplikacji i konfiguracja pocz(cid:261)tkowa Tworzona w rozdziale aplikacja musi oferowa(cid:202): (cid:81) Udost(cid:218)pnianie plików statycznych (takich jak HTML, CSS i skrypty JavaScript dzia(cid:239)aj(cid:200)ce po stronie klienta). (cid:81) Obs(cid:239)ug(cid:218) przez serwer wiadomo(cid:258)ci czatu. (cid:81) Obs(cid:239)ug(cid:218) wiadomo(cid:258)ci czatu w przegl(cid:200)darce internetowej u(cid:285)ytkownika. Aby udost(cid:218)pnia(cid:202) pliki statyczne, wykorzystamy modu(cid:239) http wbudowany w Node. Jednak podczas udost(cid:218)pniania plików za pomoc(cid:200) protoko(cid:239)u HTTP zwykle nie wystarczy jedynie wys(cid:239)a(cid:202) zawarto(cid:258)(cid:202) pliku. Konieczne jest równie(cid:285) wskazanie rodzaju wysy(cid:239)anego pliku. Odbywa si(cid:218) to przez ustawienie nag(cid:239)ówka Content-Type protoko(cid:239)u HTTP i podanie w(cid:239)a(cid:258)ciwego typu MIME dla pliku. W celu wyszukania wspomnianych typów MIME trzeba b(cid:218)dzie u(cid:285)y(cid:202) modu(cid:239)u o nazwie mime opracowanego przez firm(cid:218) trzeci(cid:200). TYPY MIME. Dok(cid:239)adne omówienie typów MIME znajdziesz w artykule Wiki- pedii: http://pl.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions. Do obs(cid:239)ugi wiadomo(cid:258)ci zwi(cid:200)zanych z czatem mo(cid:285)na wykorzysta(cid:202) technologi(cid:218) Ajax. Jednak aby zachowa(cid:202) jak najwi(cid:218)kszy stopie(cid:241) reakcji aplikacji na dzia(cid:239)ania u(cid:285)ytkownika, konieczne jest unikni(cid:218)cie tradycyjnego rozwi(cid:200)zania Ajax stosowanego do wysy(cid:239)ania wia- domo(cid:258)ci. Ajax u(cid:285)ywa protoko(cid:239)u HTTP jako mechanizmu transportowego, a wspom- niany HTTP nie zosta(cid:239) opracowany do prowadzenia komunikacji w czasie rzeczywistym. Kiedy wiadomo(cid:258)(cid:202) jest wysy(cid:239)ana za pomoc(cid:200) HTTP, konieczne jest u(cid:285)ycie nowego po(cid:239)(cid:200)- czenia TCP/IP. Otwieranie i zamykanie po(cid:239)(cid:200)cze(cid:241) zabiera cenny czas, a ilo(cid:258)(cid:202) przekazy- wanych danych ro(cid:258)nie, poniewa(cid:285) ka(cid:285)de (cid:285)(cid:200)danie zawiera nag(cid:239)ówki HTTP. Zamiast implementowa(cid:202) rozwi(cid:200)zanie oparte na HTTP, w omawianej aplikacji wykorzystamy technologi(cid:218) WebSocket (http://pl.wikipedia.org/wiki/WebSocket). Zosta(cid:239)a ona zaprojek- towana do prowadzenia dwukierunkowej, lekkiej komunikacji w czasie rzeczywistym za pomoc(cid:200) jednego gniazda TCP. Poniewa(cid:285) w wi(cid:218)kszo(cid:258)ci przypadków jedynie przegl(cid:200)darki zgodne z HTML5 obs(cid:239)u- guj(cid:200) WebSocket, w aplikacji u(cid:285)yjemy popularnej biblioteki Socket.IO (http://socket.io/). Ta biblioteka oferuje wiele rozwi(cid:200)za(cid:241) awaryjnych, mi(cid:218)dzy innymi u(cid:285)ycie technologii Flash, gdy zastosowanie WebSocket oka(cid:285)e si(cid:218) niemo(cid:285)liwe. Wspomniane rozwi(cid:200)zania Kup książkęPoleć książkę 2.2. Wymagania aplikacji i konfiguracja pocz(cid:200)tkowa 39 awaryjne s(cid:200) automatycznie obs(cid:239)ugiwane przez bibliotek(cid:218) Socket.IO i nie wymagaj(cid:200) dodatkowego kodu lub konfiguracji. Dok(cid:239)adniejsze omówienie biblioteki Socket.IO znajdziesz w rozdziale 13. Zanim faktycznie zajmiemy si(cid:218) prac(cid:200) i przyst(cid:200)pimy do pocz(cid:200)tkowej konfiguracji struktury plików i zale(cid:285)no(cid:258)ci aplikacji, warto dowiedzie(cid:202) si(cid:218), jak Node pozwala na jed- noczesn(cid:200) obs(cid:239)ug(cid:218) HTTP i WebSocket. To jeden z powodów, dla których platforma Node jest doskona(cid:239)ym wyborem w przypadku aplikacji dzia(cid:239)aj(cid:200)cych w czasie rzeczywistym. 2.2.1. Obs(cid:225)uga HTTP i WebSocket Wprawdzie w omawianej aplikacji unikamy u(cid:285)ycia technologii Ajax do wysy(cid:239)ania i otrzymywania wiadomo(cid:258)ci czatu, ale nadal korzystamy z HTTP do dostarczania plików HTML, CSS i kodu JavaScript dzia(cid:239)aj(cid:200)cego po stronie klienta, które powoduj(cid:200) przy- gotowanie aplikacji w przegl(cid:200)darce internetowej u(cid:285)ytkownika. Jak pokazano na rysunku 2.5, Node mo(cid:285)e bardzo (cid:239)atwo jednocze(cid:258)nie obs(cid:239)ugiwa(cid:202) HTTP i WebSocket za pomoc(cid:200) pojedynczego portu TCP/IP. Standardowo zawiera modu(cid:239) zapewniaj(cid:200)cy obs(cid:239)ug(cid:218) funkcjonalno(cid:258)ci HTTP. Dla Node firmy trzecie opraco- wa(cid:239)y równie(cid:285) wiele innych modu(cid:239)ów, na przyk(cid:239)ad Express, które zosta(cid:239)y zbudowane w oparciu o standardowe funkcje oferowane przez Node i pozwalaj(cid:200) na jeszcze (cid:239)atwiejsze udost(cid:218)pnianie tre(cid:258)ci. Wi(cid:218)cej informacji dotycz(cid:200)cych u(cid:285)ycia modu(cid:239)u Express podczas tworzenia aplikacji sieciowych znajdziesz w rozdziale 8. W aplikacji tworzonej w tym rozdziale wykorzystamy standardowe mo(cid:285)liwo(cid:258)ci Node. Rysunek 2.5. Obs(cid:225)uga HTTP i WebSocket w jednej aplikacji Skoro dowiedzia(cid:239)e(cid:258) si(cid:218) ju(cid:285), jakie podstawowe technologie b(cid:218)d(cid:200) wykorzystane w budo- wanej aplikacji, mo(cid:285)emy przyst(cid:200)pi(cid:202) do pracy. Czy musisz zainstalowa(cid:252) Node? Je(cid:298)eli jeszcze nie zainstalowa(cid:225)e(cid:286) Node, dok(cid:225)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 katalogu dla projektu. G(cid:239)ówny plik aplikacji b(cid:218)dzie umieszczony we wspomnianym katalogu. Konieczne jest równie(cid:285) dodanie podkatalogu lib, w którym znajdzie si(cid:218) logika dzia(cid:239)aj(cid:200)ca Kup książkęPoleć książkę 40 ROZDZIA(cid:224) 2. Tworzenie aplikacji wielopokojowego czatu po stronie serwera. Ponadto trzeba utwo- rzy(cid:202) podkatalog public przeznaczony dla plików u(cid:285)ywanych po stronie klienta. Nast(cid:218)pnie w podkatalogu public utwórz dwa kolejne: javascripts i stylesheets. Struktura katalogów powinna wygl(cid:200)da(cid:202) tak, jak pokazano na rysunku 2.6. Warto w tym miejscu doda(cid:202), (cid:285)e cho(cid:202) zdecydowa- li(cid:258)my si(cid:218) na organizacj(cid:218) plików w przedsta- wiony sposób, to jednak Node nie wymaga stosowania (cid:285)adnej struktury plików. Pliki sk(cid:239)adaj(cid:200)ce si(cid:218) na aplikacj(cid:218) mo(cid:285)esz umie(cid:258)ci(cid:202) w najbardziej odpowiadaj(cid:200)cy Ci sposób. Rysunek 2.6. Struktura katalogu projektu dla aplikacji czatu Po przygotowaniu struktury katalogów mo(cid:285)emy przyst(cid:200)pi(cid:202) do zdefiniowania zale(cid:285)no- (cid:258)ci aplikacji. W omawianym kontek(cid:258)cie zale(cid:285)no(cid:258)(cid:202) aplikacji oznacza modu(cid:239)y konieczne do zainsta- lowania, aby dostarczy(cid:202) funkcje wymagane przez aplikacj(cid:218). Na przyk(cid:239)ad przyjmujemy za(cid:239)o(cid:285)enie o tworzeniu aplikacji wymagaj(cid:200)cej dost(cid:218)pu do danych przechowywanych w bazie danych MySQL. Node nie jest standardowo wyposa(cid:285)one w modu(cid:239) pozwalaj(cid:200)cy na uzyskanie dost(cid:218)pu do MySQL. Konieczna jest wi(cid:218)c instalacja modu(cid:239)u opracowa- nego przez firm(cid:218) trzeci(cid:200) i wspomniany modu(cid:239) jest wówczas zale(cid:285)no(cid:258)ci(cid:200). 2.2.3. Wskazanie zale(cid:298)no(cid:286)ci Wprawdzie istnieje mo(cid:285)liwo(cid:258)(cid:202) utworzenia aplikacji Node bez wskazywania zale(cid:285)no(cid:258)ci, ale dobrym nawykiem jest po(cid:258)wi(cid:218)cenie chwili czasu na ich zdefiniowanie. W ten sposób konfiguracja aplikacji b(cid:218)dzie nieco (cid:239)atwiejsza, je(cid:258)li inny u(cid:285)ytkownik b(cid:218)dzie chcia(cid:239) u(cid:285)ywa(cid:202) tej aplikacji lub je(cid:258)li planujesz jej uruchamianie w wi(cid:218)cej ni(cid:285) tylko jednym miejscu. Zale(cid:285)no(cid:258)ci aplikacji s(cid:200) definiowane w pliku o nazwie package.json. Wymieniony plik zawsze powinien znajdowa(cid:202) si(cid:218) w katalogu g(cid:239)ównym aplikacji. Zawarto(cid:258)(cid:202) pliku package.json to wyra(cid:285)enie JSON w standardzie opisu pakietu CommonJS (http://wiki. commonjs.org/wiki/Packages/1.0) opisuj(cid:200)ce aplikacj(cid:218). W pliku package.json mo(cid:285)na poda(cid:202) wiele informacji, ale najwa(cid:285)niejsze to nazwa aplikacji, wersja, opis jej dzia(cid:239)ania oraz zale(cid:285)no(cid:258)ci aplikacji. W listingu 2.1 przedstawiono plik opisuj(cid:200)cy funkcjonalno(cid:258)(cid:202) i zale(cid:285)no(cid:258)ci aplikacji tworzonej w tym rozdziale. Plik zapisz pod nazw(cid:200) package.json w katalogu g(cid:239)ównym aplikacji. Listing 2.1. Plik opisuj(cid:261)cy aplikacj(cid:266) { name : chatrooms , version : 0.0.1 , description : Minimalistyczny serwer wielopokojowego czatu , dependencies : { socket.io : ~0.9.6 , Nazwa pakietu. Zale(cid:298)no(cid:286)ci pakietu. Kup książkęPoleć książkę 2.3. Udost(cid:218)pnianie plików HTML, CSS i kodu JavaScript dzia(cid:239)aj(cid:200)cego po stronie klienta 41 mime : ~1.2.7 } } Je(cid:285)eli zawarto(cid:258)(cid:202) pliku wydaje Ci si(cid:218) nieco dziwna, nie przejmuj si(cid:218) tym teraz. Wi(cid:218)cej informacji dotycz(cid:200)cych pliku package.json znajdziesz w nast(cid:218)pnym rozdziale, a jego dok(cid:239)adne omówienie w rozdziale 14. 2.2.4. Instalacja zale(cid:298)no(cid:286)ci Po zdefiniowaniu pliku package.json instalacja zale(cid:285)no(cid:258)ci aplikacji staje si(cid:218) niezwykle (cid:239)atwym zadaniem. Mened(cid:285)er pakietów Node (https://github.com/npm/npm) jest dostar- czany standardowo wraz z Node. Oferuje doskona(cid:239)e funkcje, mi(cid:218)dzy innymi mo(cid:285)liwo(cid:258)(cid:202) (cid:239)atwej instalacji modu(cid:239)ów Node opracowanych przez firmy trzecie oraz globalnego udo- st(cid:218)pniania modu(cid:239)ów opracowanych przez Ciebie. Ponadto za pomoc(cid:200) pojedynczego pole- cenia potrafi odczyta(cid:202) zale(cid:285)no(cid:258)ci z pliku package.json, a nast(cid:218)pnie je zainstalowa(cid:202). Z poziomu katalogu g(cid:239)ównego tworzo- nej aplikacji wydaj poni(cid:285)sze polecenie: npm install Je(cid:285)eli teraz zajrzysz do katalogu aplikacji, przekonasz si(cid:218), (cid:285)e jest w nim nowy podka- talog o nazwie node_modules, jak pokazano na rysunku 2.7. Wymieniony podkatalog zawiera zale(cid:285)no(cid:258)ci aplikacji. Maj(cid:200)c przygotowan(cid:200) struktur(cid:218) katalogu aplikacji i zainstalowane zale(cid:285)no(cid:258)ci, mo(cid:285)na ju(cid:285) przyst(cid:200)pi(cid:202) do tworzenia logiki aplikacji. Rysunek 2.7. Po u(cid:298)yciu mened(cid:298)era npm do instalacji zale(cid:298)no(cid:286)ci zostanie utworzony podkatalog o nazwie node_modules 2.3. Udost(cid:266)pnianie plików HTML, CSS i kodu JavaScript dzia(cid:225)aj(cid:261)cego po stronie klienta Jak wcze(cid:258)niej wspomniano, budowana tutaj aplikacja czatu powinna oferowa(cid:202) wymie- nione poni(cid:285)ej mo(cid:285)liwo(cid:258)ci: (cid:81) Udost(cid:218)pnianie plików statycznych przegl(cid:200)darce internetowej u(cid:285)ytkownika. (cid:81) Obs(cid:239)ug(cid:218) przez serwer wiadomo(cid:258)ci zwi(cid:200)zanych z czatem. (cid:81) Obs(cid:239)ug(cid:218) wiadomo(cid:258)ci czatu w przegl(cid:200)darce internetowej u(cid:285)ytkownika. Logika aplikacji b(cid:218)dzie obs(cid:239)ugiwana przez wiele plików, cz(cid:218)(cid:258)(cid:202) wykorzystywanych po stronie serwera, inne po stronie klienta, jak pokazano na rysunku 2.8. Pliki kodu Java- Script dzia(cid:239)aj(cid:200)cego po stronie klienta musz(cid:200) by(cid:202) udost(cid:218)pniane w postaci zasobów sta- tycznych, a nie przetwarzane przez Node. W tym podrozdziale zajmiemy si(cid:218) spe(cid:239)nieniem pierwszego wymagania stawianego aplikacji: zdefiniujemy logik(cid:218) niezb(cid:218)dn(cid:200) do udost(cid:218)pniania plików statycznych. Nast(cid:218)p- nie dodamy pliki statyczne z kodem HTML i CSS. Kup książkęPoleć książkę 42 ROZDZIA(cid:224) 2. Tworzenie aplikacji wielopokojowego czatu Rysunek 2.8. W budowanej aplikacji czatu po stronie zarówno serwera, jak i klienta istnieje logika JavaScript 2.3.1. Tworzenie podstawowego serwera plików statycznych Aby utworzy(cid:202) serwer plików statycznych, konieczne jest wykorzystanie pewnych wbu- dowanych funkcji Node, a tak(cid:285)e opracowanego przez firm(cid:218) trzeci(cid:200) modu(cid:239)u mime w celu ustalenia typu MIME danego pliku. Rozpoczynamy od g(cid:239)ównego pliku aplikacji. W katalogu g(cid:239)ównym projektu utwórz plik o nazwie server.js i umie(cid:258)(cid:202) w nim deklaracje zmiennych przedstawione w lis- tingu 2.2. Wspomniane deklaracje pozwalaj(cid:200) na uzyskanie dost(cid:218)pu do funkcji HTTP w Node, a tak(cid:285)e na prac(cid:218) z systemem plików, u(cid:285)ycie funkcji zwi(cid:200)zanych ze (cid:258)cie(cid:285)kami dost(cid:218)pu do plików oraz mo(cid:285)liwo(cid:258)(cid:202) ustalenia typu MIME danego pliku. Zmienn(cid:200) cache wykorzystamy 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 ); Wbudowany modu(cid:225) http dostarcza funkcje dotycz(cid:261)ce serwera i klienta. Wbudowany modu(cid:225) fs dostarcza funkcje przeznaczone do pracy z systemem plików. Wbudowany modu(cid:225) path dostarcza funkcje przeznaczone do pracy ze (cid:286)cie(cid:298)kami dost(cid:266)pu systemu plików. var cache = {}; Obiekt cache s(cid:225)u(cid:298)y do przechowywania buforowanych plików. Dodatkowy modu(cid:225) mime zapewnia mo(cid:298)liwo(cid:286)(cid:252) ustalenia typu MIME na podstawie rozszerzenia pliku. Kup książkęPoleć książkę 2.3. Udost(cid:218)pnianie plików HTML, CSS i kodu JavaScript dzia(cid:239)aj(cid:200)cego po stronie klienta 43 WYSY(cid:224)ANIE DANYCH PLIKU I ODPOWIEDZI W POSTACI B(cid:224)(cid:265)DÓW Kolejnym krokiem jest utworzenie trzech funkcji pomocniczych u(cid:285)ywanych do udost(cid:218)p- niania statycznych plików HTTP. Pierwsza powoduje wygenerowanie b(cid:239)(cid:218)du o kodzie 404, je(cid:258)li (cid:285)(cid:200)dany plik nie istnieje. W pliku server.js umie(cid:258)(cid:202) wi(cid:218)c poni(cid:285)szy kod funkcji pomocniczej: function send404(response) { response.writeHead(404, { Content-Type : text/plain }); response.write( B(cid:273)(cid:230)d 404: plik nie zosta(cid:273) znaleziony. ); response.end(); } Druga funkcja pomocnicza dostarcza dane pliku. Najpierw przygotowuje odpowiednie nag(cid:239)ówki HTTP, a nast(cid:218)pnie wysy(cid:239)a zawarto(cid:258)(cid:202) pliku. W pliku server.js umie(cid:258)(cid:202) wi(cid:218)c poni(cid:285)szy kod: function sendFile(response, filePath, fileContents) { response.writeHead( 200, { content-type : mime.lookup(path.basename(filePath))} ); response.end(fileContents); } Uzyskanie dost(cid:218)pu do pami(cid:218)ci operacyjnej (RAM) jest szybsze ni(cid:285) do systemu plików. Dlatego te(cid:285) aplikacje Node buforuj(cid:200) w pami(cid:218)ci cz(cid:218)sto u(cid:285)ywane dane. Budowana tutaj aplikacja czatu b(cid:218)dzie buforowa(cid:239)a w pami(cid:218)ci pliki statyczne i odczyta je z dysku tylko podczas pierwszego ich (cid:285)(cid:200)dania. Trzecia funkcja pomocnicza sprawdza wi(cid:218)c, czy plik jest buforowany, a nast(cid:218)pnie go udost(cid:218)pnia. Je(cid:285)eli plik nie jest jeszcze buforowany, wtedy zostanie odczytany z dysku i udost(cid:218)pniony. Je(cid:285)eli plik nie istnieje, odpowiedzi(cid:200) b(cid:218)dzie kod b(cid:239)(cid:218)du HTTP 404. W pliku server.js umie(cid:258)(cid:202) wi(cid:218)c kod funkcji pomocniczej przedstawionej w listingu 2.3. Listing 2.3. Funkcja pomocnicza udost(cid:266)pniaj(cid:261)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 buforowany w pami(cid:266)ci. Udost(cid:266)pnienie pliku z pami(cid:266)ci. Sprawdzenie, czy plik istnieje. Odczyt pliku z dysku. Udost(cid:266)pnienie pliku odczytanego z dysku. Wys(cid:225)anie odpowiedzi HTTP 404. Kup książkęPoleć książkę 44 ROZDZIA(cid:224) 2. Tworzenie aplikacji wielopokojowego czatu }); } } TWORZENIE SERWERA HTTP W przypadku serwera HTTP funkcja anonimowa dostarczana jako argument funkcji createServer() dzia(cid:239)a w charakterze wywo(cid:239)ania definiuj(cid:200)cego sposób obs(cid:239)ugi poszcze- gólnych (cid:285)(cid:200)da(cid:241) HTTP. Funkcja wywo(cid:239)ania zwrotnego akceptuje dwa argumenty: request i response. Podczas jej wywo(cid:239)ania serwer HTTP wype(cid:239)ni wspomniane argumenty obiek- tami, które pozwol(cid:200) na odpowiednio odczyt szczegó(cid:239)ów (cid:285)(cid:200)dania oraz przygotowanie odpowiedzi. Wi(cid:218)cej informacji o module http Node znajdziesz w rozdziale 4. W pliku server.js umie(cid:258)(cid:202) kod przedstawiony w listingu 2.4, odpowiedzialny za utwo- rzenie serwera HTTP. Listing 2.4. Logika tworz(cid:261)ca serwer HTTP var server = http.createServer(function(request, response) { var filePath = false; Wskazanie pliku HTML, który ma by(cid:252) domy(cid:286)lnie udost(cid:266)pniany. if (request.url == / ) { filePath = public/index.html ; } else { filePath = public + request.url; } var absPath = ./ + filePath; serveStatic(response, cache, absPath); }); Utworzenie serwera HTTP za pomoc(cid:261) funkcji anonimowej definiuj(cid:261)cej zachowanie w poszczególnych (cid:298)(cid:261)daniach. Zamiana adresu URL na wzgl(cid:266)dn(cid:261) (cid:286)cie(cid:298)k(cid:266) dost(cid:266)pu do pliku. Udost(cid:266)pnienie pliku statycznego. URUCHOMIENIE SERWERA HTTP W kodzie utworzyli(cid:258)my serwer HTTP, ale nie dodali(cid:258)my jeszcze logiki niezb(cid:218)dnej do jego uruchomienia. Poni(cid:285)szy fragment kodu powoduje uruchomienie serwera i nas(cid:239)u- chiwanie TCP/IP na porcie 3000. Port 3000 zosta(cid:239) wybrany dowolnie, mo(cid:285)na skorzy- sta(cid:202) z ka(cid:285)dego nieu(cid:285)ywanego portu o numerze wi(cid:218)kszym ni(cid:285) 1024 (port 1024 równie(cid:285) mo(cid:285)e dzia(cid:239)a(cid:202), je(cid:258)li korzystasz z systemu Windows, natomiast w systemach Linux i OS X konieczne jest wówczas uruchomienie aplikacji przez u(cid:285)ytkownika uprzywilejowanego, na przyk(cid:239)ad root). server.listen(3000, function() { console.log( Serwer nas(cid:273)uchuje na porcie 3000. ); }); Je(cid:285)eli chcesz si(cid:218) przekona(cid:202), jak aplikacja dzia(cid:239)a na tym etapie, to mo(cid:285)esz uruchomi(cid:202) serwer przez wydanie poni(cid:285)szego polecenia w wierszu polece(cid:241): node server.js Po uruchomieniu serwera przej(cid:258)cie pod adres http://127.0.0.1:3000 w przegl(cid:200)darce inter- netowej spowoduje wywo(cid:239)anie funkcji pomocniczej generuj(cid:200)cej kod b(cid:239)(cid:218)du 404, a wi(cid:218)c wy(cid:258)wietlenie komunikatu B(cid:273)(cid:230)d 404: plik nie zosta(cid:273) znaleziony. Wprawdzie aplikacja Kup książkęPoleć książkę 2.3. Udost(cid:218)pnianie plików HTML, CSS i kodu JavaScript dzia(cid:239)aj(cid:200)cego po stronie klienta 45 zawiera logik(cid:218) odpowiedzialn(cid:200) za obs(cid:239)ug(cid:218) plików statycznych, ale jeszcze nie dodali(cid:258)my (cid:285)adnego tego rodzaju pliku. Warto w tym miejscu wspomnie(cid:202), (cid:285)e dzia(cid:239)anie serwera mo(cid:285)na zatrzyma(cid:202) przez naci(cid:258)ni(cid:218)cie klawiszy Ctrl+C w pow(cid:239)oce. Przechodzimy teraz do dodania plików statycznych zapewniaj(cid:200)cych nieco wi(cid:218)ksz(cid:200) funkcjonalno(cid:258)(cid:202) aplikacji czatu. 2.3.2. Dodanie plików HTML i CSS Pierwszy dodawany plik statyczny zawiera kod HTML. W katalogu public utwórz plik o nazwie index.html, a nast(cid:218)pnie umie(cid:258)(cid:202) w nim kod HTML przedstawiony w listingu 2.5. Wspomniany kod HTML powoduje do(cid:239)(cid:200)czenie pliku arkusza stylów (CSS), zdefiniowa- nie pewnych elementów HTML div przeznaczonych do wy(cid:258)wietlania tre(cid:258)ci aplikacji, a tak(cid:285)e do wczytania kilku plików zawieraj(cid:200)cych kod JavaScript dzia(cid:239)aj(cid:200)cy po stronie klienta. Pliki JavaScript zapewniaj(cid:200) dost(cid:218)p do funkcji biblioteki Socket.IO, biblioteki jQuery (w celu (cid:239)atwiejszej pracy z modelem DOM), a tak(cid:285)e oferuj(cid:200) przygotowane specjalnie dla budowanej aplikacji funkcje obs(cid:239)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 Element div , w którym b(cid:266)dzie wy(cid:286)wietlona nazwa aktualnego pokoju czatu. Element div , w którym b(cid:266)dzie wy(cid:286)wietlona lista dost(cid:266)pnych pokoi czatu. form id= send-form input id= send-message / input id= send-button type= submit value= Wy(cid:295)lij / Element div , w którym b(cid:266)d(cid:261) wy(cid:286)wietlone wiadomo(cid:286)ci czatu. Element input formularza, w którym u(cid:298)ytkownik b(cid:266)dzie wydawa(cid:225) polecenia i wpisywa(cid:225) wiadomo(cid:286)ci. div id= help Polecenia czatu: ul li Zmiana nazwy u(cid:318)ytkownika: code /nick [nazwa u(cid:318)ytkownika] /code /li li Przej(cid:295)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 Kup książkęPoleć książkę 46 ROZDZIA(cid:224) 2. Tworzenie aplikacji wielopokojowego czatu Kolejny plik, który trzeba doda(cid:202), zawiera style CSS u(cid:285)ywane w aplikacji. W katalogu public/stylesheets utwórz plik o nazwie style.css, a nast(cid:218)pnie umie(cid:258)(cid:202) w nim kod CSS przedstawiony w listingu 2.6. Listing 2.6. Kod CSS u(cid:298)ywany przez aplikacj(cid:266) 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; } Aplikacja b(cid:266)dzie mia(cid:225)a szeroko(cid:286)(cid:252) 800 pikseli i zostanie wy(cid:286)rodkowana poziomo. Regu(cid:225)a CSS dla elementu, w którym wy(cid:286)wietlana jest nazwa aktualnego pokoju czatu. Element wiadomo(cid:286)ci ma szeroko(cid:286)(cid:252) 690 pikseli i wysoko(cid:286)(cid:252) 300 pikseli. Element div wy(cid:286)wietlaj(cid:261)cy wiadomo(cid:286)ci czatu b(cid:266)dzie móg(cid:225) by(cid:252) przewijany, gdy wiadomo(cid:286)ci ca(cid:225)kowicie go wype(cid:225)ni(cid:261). Po dodaniu plików HTML i CSS mo(cid:285)esz uruchomi(cid:202) aplikacj(cid:218) w przegl(cid:200)darce interne- towej. Na obecnym etapie prac powinna wygl(cid:200)da(cid:202) jak na rysunku 2.9. Aplikacja oczywi(cid:258)cie nie oferuje jeszcze pe(cid:239)nej funkcjonalno(cid:258)ci, ale pliki statyczne s(cid:200) udost(cid:218)pniane, a podstawowy uk(cid:239)ad graficzny prawid(cid:239)owo generowany. Przechodzimy wi(cid:218)c teraz do przygotowania kodu dzia(cid:239)aj(cid:200)cego po stronie serwera i odpowiedzialnego za obs(cid:239)ug(cid:218) wiadomo(cid:258)ci. 2.4. Obs(cid:225)uga wiadomo(cid:286)ci czatu za pomoc(cid:261) biblioteki Socket.IO Z trzech wymaga(cid:241) stawianych budowanym aplikacjom omówili(cid:258)my dot(cid:200)d pierwsze, czyli udost(cid:218)pnianie plików statycznych. Przechodzimy teraz do drugiego — obs(cid:239)ugi komuni- kacji mi(cid:218)dzy przegl(cid:200)dark(cid:200) internetow(cid:200) i serwerem. Nowoczesne przegl(cid:200)darki interne- towe maj(cid:200) mo(cid:285)liwo(cid:258)(cid:202) u(cid:285)ycia technologii WebSocket do obs(cid:239)ugi komunikacji mi(cid:218)dzy przegl(cid:200)dark(cid:200) i serwerem. (Dok(cid:239)adne informacje dotycz(cid:200)ce obs(cid:239)ugi WebSocket w prze- gl(cid:200)darkach internetowych znajdziesz na stronie http://socket.io/#browser-support). Kup książkęPoleć książkę 2.4. Obs(cid:239)uga wiadomo(cid:258)ci czatu za pomoc(cid:200) biblioteki Socket.IO 47 Rysunek 2.9. Aplikacja czatu na obecnym etapie prac WebSocket zapewnia warstw(cid:218) abstrakcji dla siebie oraz dla innych mechanizmów transportu, zarówno dla Node, jak i kodu JavaScript dzia(cid:239)aj(cid:200)cego po stronie klienta. Biblioteka Socket.IO automatycznie zapewnia rozwi(cid:200)zania awaryjne, je(cid:258)li obs(cid:239)uga Web- Socket nie zosta(cid:239)a zaimplementowana w przegl(cid:200)darce internetowej. We wszystkich przypadkach u(cid:285)ywane jest to samo API. W tym podrozdziale: (cid:81) pokrótce poznasz bibliotek(cid:218) Socket.IO oraz zdefiniujesz funkcje Socket.IO niezb(cid:218)dne po stronie serwera; (cid:81) dodasz kod odpowiedzialny za konfiguracj(cid:218) serwera Socket.IO; (cid:81) dodasz kod odpowiedzialny za obs(cid:239)ug(cid:218) ró(cid:285)nych zdarze(cid:241) czatu. Biblioteka Socket.IO standardowo oferuje wirtualne kana(cid:239)y, wi(cid:218)c zamiast rozg(cid:239)asza(cid:202) ka(cid:285)d(cid:200) wiadomo(cid:258)(cid:202) do wszystkich po(cid:239)(cid:200)czonych u(cid:285)ytkowników, mo(cid:285)na j(cid:200) przekaza(cid:202) jedynie do tych, którzy s(cid:200) subskrybentami danego kana(cid:239)u. Dzi(cid:218)ki tej funkcji implementacja pokoi czatu w budowanej tutaj aplikacji staje si(cid:218) naprawd(cid:218) (cid:239)atwym zadaniem, o czym si(cid:218) wkrótce przekonasz. Kup książkęPoleć książkę 48 ROZDZIA(cid:224) 2. Tworzenie aplikacji wielopokojowego czatu Biblioteka Socket.IO to równie(cid:285) doskona(cid:239)y przyk(cid:239)ad u(cid:285)yteczno(cid:258)ci emiterów zdarze(cid:241). Wspomniany emiter zdarze(cid:241) to w zasadzie u(cid:285)yteczny wzorzec organizacji logiki asyn- chronicznej. W tym rozdziale poznasz kod pewnych emiterów zdarze(cid:241), ale tym tema- tem dok(cid:239)adnie zajmiemy si(cid:218) w nast(cid:218)pnym rozdziale. Emiter zdarze(cid:276) Pod wzgl(cid:266)dem koncepcji emiter zdarze(cid:276) jest powi(cid:261)zany z pewnego rodzaju zasobem, mo(cid:298)e wysy(cid:225)a(cid:252) i otrzymywa(cid:252) wiadomo(cid:286)ci do oraz z zasobu. Wspomnianym zasobem mo(cid:298)e by(cid:252) po(cid:225)(cid:261)czenie ze zdalnym serwerem lub co(cid:286) znacznie bardziej abstrakcyjnego, na przyk(cid:225)ad posta(cid:252) w grze. Projekt Johnny-Five (https://github.com/rwaldron/johnny-five) wykorzy- stuje Node w aplikacjach robotów i u(cid:298)ywa emiterów zdarze(cid:276) do kontrolowania mikrokon- trolerów Arduino. W pierwszej kolejno(cid:258)ci trzeba uruchomi(cid:202) serwer i przygotowa(cid:202) logik(cid:218) odpowiedzialn(cid:200) za nawi(cid:200)zywanie po(cid:239)(cid:200)czenia. Nast(cid:218)pnie przyst(cid:200)pimy do zdefiniowania funkcji wyma- ganych po stronie serwera. 2.4.1. Konfiguracja serwera Socket.IO Na pocz(cid:200)tku w pliku server.js nale(cid:285)y umie(cid:258)ci(cid:202) dwa podane poni(cid:285)ej wiersze kodu. Pierw- szy powoduje wczytanie funkcji ze wskazanego modu(cid:239)u Node dostarczaj(cid:200)cego logik(cid:218) potrzebn(cid:200) do obs(cid:239)ugi po stronie serwera funkcji czatu zwi(cid:200)zanych z bibliotek(cid:200) Soc- ket.IO. Wskazany modu(cid:239) zdefiniujemy za chwil(cid:218). Natomiast drugi wiersz uruchamia serwer i dostarcza funkcje Socket.IO przy za(cid:239)o(cid:285)eniu, (cid:285)e mamy ju(cid:285) zdefiniowany serwer HTTP, co pozwala na wspó(cid:239)dzielenie tego samego portu TCP/IP: var chatServer = require( ./lib/chat_server ); chatServer.listen(server); Teraz trzeba utworzy(cid:202) plik chat_server.js w podkatalogu lib. Na pocz(cid:200)tku w wymie- nionym pliku umie(cid:258)(cid:202) poni(cid:285)sze deklaracje zmiennych. Te deklaracje pozwol(cid:200) na u(cid:285)ycie biblioteki Socket.IO, a tak(cid:285)e inicjalizuj(cid:200) 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(cid:224)(cid:260)CZENIA Kolejnym krokiem jest dodanie przedstawionej w listingu 2.7 logiki odpowiedzialnej za zdefiniowanie funkcji listen serwera czatu. Wymieniona funkcja jest wywo(cid:239)ywana w pliku server.js. Powoduje uruchomienie serwera Socket.IO, ogranicza ilo(cid:258)(cid:202) danych wy(cid:258)wietlanych w konsoli przez bibliotek(cid:218) Socket.IO, a tak(cid:285)e definiuje sposób obs(cid:239)ugi wszystkich po(cid:239)(cid:200)cze(cid:241) przychodz(cid:200)cych. Kup książkęPoleć książkę 2.4. Obs(cid:239)uga wiadomo(cid:258)ci czatu za pomoc(cid:200) 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); Uruchomienie serwera Socket.IO i umo(cid:298)liwienie mu wspó(cid:225)pracy z istniej(cid:261)cym serwerem HTTP. io.sockets.on( connection , function (socket) { guestNumber = assignGuestName(socket, guestNumber, (cid:180)nickNames, namesUsed); Zdefiniowanie sposobu obs(cid:225)ugi po(cid:225)(cid:261)czenia u(cid:298)ytkownika. Przypisanie u(cid:298)ytkownikowi nazwy go(cid:286)cia podczas nawi(cid:261)zywania po(cid:225)(cid:261)czenia. joinRoom(socket, Lobby ); Umieszczenie u(cid:298)ytkownika w pokoju Lobby, gdy próbuje on nawi(cid:261)za(cid:252) po(cid:225)(cid:261)czenie. handleMessageBroadcasting(socket, nickNames); handleNameChangeAttempts(socket, nickNames, namesUsed); handleRoomJoining(socket); Obs(cid:225)uga wiadomo(cid:286)ci u(cid:298)ytkownika, prób zmiany nazwy u(cid:298)ytkownika, a tak(cid:298)e tworzenia lub zmiany pokoju czatu. socket.on( rooms , function() { Wy(cid:286)wietlenie u(cid:298)ytkownika wraz z list(cid:261) pokoi, w których prowadzi czat. socket.emit( rooms , io.sockets.manager.rooms); }); handleClientDisconnection(socket, nickNames, namesUsed); Zdefiniowanie logiki wykonywanej podczas roz(cid:225)(cid:261)czania u(cid:298)ytkownika. }); }; Jak mo(cid:285)esz zauwa(cid:285)y(cid:202), logika obs(cid:239)ugi po(cid:239)(cid:200)czenia wywo(cid:239)uje wiele funkcji pomocniczych, które teraz trzeba b(cid:218)dzie zdefiniowa(cid:202) w pliku chat_server.js. Po przygotowaniu logiki odpowiedzialnej za nawi(cid:200)zywanie po(cid:239)(cid:200)czenia trzeba zdefi- niowa(cid:202) kilka funkcji pomocniczych, które obs(cid:239)uguj(cid:200) inne funkcjonalno(cid:258)ci oferowane przez aplikacj(cid:218). 2.4.2. Obs(cid:225)uga zdarze(cid:276) oraz scenariuszy w aplikacji Aplikacja czatu musi zapewni(cid:202) obs(cid:239)ug(cid:218) wymienionych poni(cid:285)ej zdarze(cid:241) i rodzajów scenariuszy: (cid:81) przypisanie nazwy go(cid:258)cia, (cid:81) (cid:285)(cid:200)danie zmiany pokoju, (cid:81) (cid:285)(cid:200)danie zmiany nazwy u(cid:285)ytkownika, (cid:81) wysy(cid:239)anie wiadomo(cid:258)ci czatu, (cid:81) tworzenie pokoju, roz(cid:239)(cid:200)czanie u(cid:285)ytkownika. (cid:81) Do obs(cid:239)ugi wymienionych funkcji konieczne jest przygotowanie kilku dodatkowych funkcji pomocniczych. Kup książkęPoleć książkę 50 ROZDZIA(cid:224) 2. Tworzenie aplikacji wielopokojowego czatu PRZYPISANIE NAZWY GO(cid:285)CIA Pierwsza funkcja pomocnicza, któr(cid:200) trzeba doda(cid:202), nosi nazw(cid:218) assignGuestName() i jest odpowiedzialna za obs(cid:239)ug(cid:218) nadawania nazwy nowemu u(cid:285)ytkownikowi. Kiedy u(cid:285)ytkow- nik po raz pierwszy nawi(cid:200)zuje po(cid:239)(cid:200)czenie z serwerem czatu, zostaje umieszczony w pokoju Lobby. Jednocze(cid:258)nie nast(cid:218)puje wywo(cid:239)anie funkcji assignGuestName() i przypi- sanie mu nazwy odró(cid:285)niaj(cid:200)cej nowego u(cid:285)ytkownika od pozosta(cid:239)ych. Nazwa ka(cid:285)dego go(cid:258)cia to w zasadzie s(cid:239)owo Go(cid:295)(cid:232), po którym znajduje si(cid:218) liczba o warto(cid:258)ci zwi(cid:218)kszanej po nawi(cid:200)zaniu po(cid:239)(cid:200)czenia przez ka(cid:285)dego kolejnego u(cid:285)ytkownika. Nazwa go(cid:258)cia jest przechowywana w zmiennej nickNames powi(cid:200)zanej z wewn(cid:218)trznym identyfikatorem gniazda. Ponadto nazwa zostaje dodana do namesUsed, czyli zmiennej zawieraj(cid:200)cej u(cid:285)yte dot(cid:200)d nazwy u(cid:285)ytkowników. Implementacja funkcji assignGuestName() zosta(cid:239)a przedstawiona w listingu 2.8, dodaj j(cid:200) do pliku lib/chat_server.js. Listing 2.8. Przypisanie nazwy go(cid:286)cia function assignGuestName(socket, guestNumber, nickNames, namesUsed) { var name = Go(cid:295)(cid:232) + guestNumber; nickNames[socket.id] = name; socket.emit( nameResult , { success: true, name: name }); namesUsed.push(name); return guestNumber + 1; } Wygenerowanie nowej nazwy go(cid:286)cia. Powi(cid:261)zanie nazwy go(cid:286)cia z identyfikatorem po(cid:225)(cid:261)czenia klienta. Podanie u(cid:298)ytkownikowi wygenerowanej dla niego nazwy. Zwró(cid:252) uwag(cid:266) na u(cid:298)ycie nazwy go(cid:286)cia. Inkrementacja licznika u(cid:298)ywanego podczas generowania nazw go(cid:286)ci. DO(cid:224)(cid:260)CZANIE DO POKOJU Druga funkcja pomocnicza, któr(cid:200) trzeba doda(cid:202) do pliku chat_server.js, nosi nazw(cid:218) joinRoom(). Kod wymienionej funkcji przedstawiono w listingu 2.9. Jest ona odpowie- dzialna za obs(cid:239)ug(cid:218) logiki zwi(cid:200)zanej z do(cid:239)(cid:200)czaniem u(cid:285)ytkownika do pokoju czatu. Listing 2.9. Logika obs(cid:225)uguj(cid:261)ca do(cid:225)(cid:261)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(cid:273)(cid:230)czy(cid:273) do pokoju + room + . }); Do(cid:225)(cid:261)czenie uczestnika do pokoju. Ustalenie, czy jeszcze inni uczestnicy znajduj(cid:261) si(cid:266) w danym pokoju. Zauwa(cid:298), (cid:298)e u(cid:298)ytkownik znajduje si(cid:266) w pokoju. Poinformowanie uczestnika, (cid:298)e znajduje si(cid:266) we wskazanym pokoju. Poinformowanie pozosta(cid:225)ych uczestników w pokoju o do(cid:225)(cid:261)czeniu nowego. Je(cid:298)eli w pokoju s(cid:261) inni uczestnicy, aplikacja wy(cid:286)wietla ich liczb(cid:266). var usersInRoom = io.sockets.clients(room); if (usersInRoom.length 1) { var usersInRoomSummary = Lista u(cid:318)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]; } Kup książkęPoleć książkę 2.4. Obs(cid:239)uga wiadomo(cid:258)ci czatu za pomoc(cid:200) biblioteki Socket.IO 51 } usersInRoomSummary += . ; socket.emit( message , {text: usersInRoomSummary}); } } Przekazanie nowemu uczestnikowi podsumowania o innych uczestnikach znajduj(cid:261)cych si(cid:266) w pokoju. Dzi(cid:218)ki bibliotece Socket.IO do(cid:239)(cid:200)czenie uczestnika do pokoju czatu jest prost(cid:200) operacj(cid:200) i wymaga jedynie wywo(cid:239)ania metody join obiektu socket. Nast(cid:218)pnie aplikacja podaje informacje szczegó(cid:239)owe uczestnikowi oraz pozosta(cid:239)ym uczestnikom znajduj(cid:200)cym si(cid:218) w tym samym pokoju. Aplikacja podaje liczb(cid:218) osób znajduj(cid:200)cych si(cid:218) w pokoju czatu, a tak(cid:285)e informuje pozosta(cid:239)ych uczestników w pokoju o do(cid:239)(cid:200)czeniu nowego. OBS(cid:224)UGA (cid:297)(cid:260)DA(cid:275) ZMIANY NAZWY U(cid:297)YTKOWNIKA Je(cid:285)eli ka(cid:285)dy uczestnik zachowa przydzielon(cid:200) mu nazw(cid:218) go(cid:258)cia, wtedy trudno b(cid:218)dzie po(cid:239)apa(cid:202) si(cid:218), kto jest kim. Dlatego te(cid:285) aplikacja czatu pozwala u(cid:285)ytkownikowi na zmian(cid:218) jego nazwy. Jak pokazano na rysunku 2.10, zmiana nazwy powoduje wykonanie przez przegl(cid:200)dark(cid:218) internetow(cid:200) u(cid:285)ytkownika (cid:285)(cid:200)dania za pomoc(cid:200) Socket.IO, a nast(cid:218)pnie otrzy- manie odpowiedzi wskazuj(cid:200)cej na sukces lub niepowodzenie operacji. Rysunek 2.10. (cid:297)(cid:261)danie zmiany nazwy u(cid:298)ytkownika i odpowied(cid:296) negatywna W pliku lib/chat_server.js umie(cid:258)(cid:202) kod przedstawiony w listingu 2.10 zawieraj(cid:200)cy defini- cj(cid:218) funkcji odpowiedzialnej za obs(cid:239)ug(cid:218) (cid:285)(cid:200)da(cid:241) zmiany nazwy u(cid:285)ytkownika. Z perspek- tywy aplikacji u(cid:285)ytkownik nie mo(cid:285)e zmieni(cid:202) nazwy na rozpoczynaj(cid:200)c(cid:200) si(cid:218) od s(cid:239)owa Go(cid:295)(cid:232) lub b(cid:218)d(cid:200)cej ju(cid:285) w u(cid:285)yciu. Listing 2.10. Logika odpowiedzialna za obs(cid:225)ug(cid:266) zmiany nazwy u(cid:298)ytkownika function handleNameChangeAttempts(socket, nickNames, namesUsed) { socket.on( nameAttempt , function(name) { if (name.indexOf( Go(cid:295)(cid:232) ) == 0) { socket.emit( nameResult , { success: false, message: Nazwa u(cid:318)ytkownika nie mo(cid:318)e rozpoczyna(cid:232) si(cid:250) od s(cid:273)owa Go(cid:295)(cid:232) . }); } else { if (namesUsed.indexOf(name) == -1) { var previousName = nickNames[socket.id]; Dodanie funkcji nas(cid:225)uchuj(cid:261)cej zdarze(cid:276) nameAttempt. Niedozwolone jest u(cid:298)ycie nazwy rozpoczynaj(cid:261)cej si(cid:266) od s(cid:225)owa Go(cid:286)(cid:252). Je(cid:298)eli nazwa nie jest jeszcze zarejestrowana, wtedy nale(cid:298)y j(cid:261) zarejestrowa(cid:252). Kup książkęPoleć książkę 52 ROZDZIA(cid:224) 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(cid:273) nazw(cid:250) na + name + . }); } else { socket.emit( nameResult , { success: false, message: Ta nazwa jest u(cid:318)ywana przez innego u(cid:318)ytkownika. }); } } }); } Usuni(cid:266)cie poprzedniej nazwy u(cid:298)ytkownika i tym samym udost(cid:266)pnienie jej innym klientom. Wygenerowanie b(cid:225)(cid:266)du, je(cid:286)li wybrana nazwa jest ju(cid:298) u(cid:298)ywana przez innego u(cid:298)ytkownika. WYSY(cid:224)ANIE WIADOMO(cid:285)CI CZATU Kiedy zadbali(cid:258)my ju(cid:285) o nazwy u(cid:285)ytkowników, przechodzimy do dodania kolejnej funkcji. Odpowiada ona za obs(cid:239)ug(cid:218) sposobu wysy(cid:239)ania wiadomo(cid:258)ci czatu. Na rysunku 2.11 poka- zano podstaw(cid:218) dzia(cid:239)ania tego procesu: u(cid:285)ytkownik emituje zdarzenie wskazuj(cid:200)ce pokój, do którego ma zosta(cid:202) wys(cid:239)ana wiadomo(cid:258)(cid:202), oraz jej tekst. Nast(cid:218)pnie serwer przekazuje wiadomo(cid:258)(cid:202) do wszystkich uczestników czatu znajduj(cid:200)cych si(cid:218) w danym pokoju. Rysunek 2.11. Wysy(cid:225)anie wiadomo(cid:286)ci czatu Poni(cid:285)szy kod umie(cid:258)(cid:202) w pliku lib/chat_server.js. Do przekazywania wiadomo(cid:258)ci jest u(cid:285)ywana funkcja broadcast() biblioteki Socket.IO: function handleMessageBroadcasting(socket) { socket.on( message , function (message) { socket.broadcast.to(message.room).emit( message , { Kup książkęPoleć książkę 2.4. Obs(cid:239)uga wiadomo(cid:258)ci czatu za pomoc(cid:200) biblioteki Socket.IO 53 text: nickNames[socket.id] + : + message.text }); }); } TWORZENIE POKOJU Kolejnym krokiem jest dodanie funkcji pozwalaj(cid:200)cej u(cid:285)ytkownikowi na do(cid:239)(cid:200)czenie do istniej(cid:200)cego pokoju czatu lub utworzenie nowego. Na rysunku 2.12 pokazano interakcje zachodz(cid:200)ce wówczas mi(cid:218)dzy u(cid:285)ytkownikiem i serwerem. Rysunek 2.12. Przej(cid:286)cie do innego pokoju czatu Poni(cid:285)szy kod umie(cid:258)(cid:202) w pliku lib/chat_server.js, umo(cid:285)liwiaj(cid:200)c tym samym zmian(cid:218) pokoju czatu. Zwró(cid:202) uwag(cid:218) na u(cid:285)ycie metody leave() biblioteki Socket.IO: function handleRoomJoining(socket) { socket.on( join , function(room) { socket.leave(currentRoom[socket.id]); joinRoom(socket, room.newRoom); })
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:


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ą: