Node.js Co to jest NODE.JS? Nowoczesne środowisko programistyczne Środowisko programistyczne w sensie zestawu gotowych klas i metod których można używać do przygotowania własnych skalowalnych i wydajnych aplikacji internetowych.
JavaScript po stronie serwera Dzięki zastosowaniu silnika V8 wprowadzono zupełnie nowe podejście w myśleniu o wykonywaniu kodu JavaScript
JavaScript po stronie serwera Musimy odwrócić sposób myślenia jeśli chodzi wykonywanie JavaScriptu.
Instalacja http://nodejs.org/ Pobieramy pakiet w postaci archiwum tar który instalujemy: node-v0.10.33.tar.gz
Instalacja http://nodejs.org/ Pobieramy pakiet w postaci archiwum tar który instalujemy: node-v0.10.33.tar.gz Alternatywnie mamy dostęp do wersji na różne systemy operacyjne oraz wersje skompilowane w postaci plików wykonywalnych.
Instalacja dla Linux Dla Linuxa pobieramy ten pakiet dostosowany do architektury komputera 32-bitowej lub 64-bitowej
Instalacja dla Linux Program wykonywalny służący do uruchamiania aplikacji napisanych w języku JS Program wykonywalny obsługujący repozytorium modułów systemu środowiska node.js Biblioteka pobranych z repozytorium modułów.
Instalacja dla Linux Przechodzimy do kartoteki bin gdzie wykonujemy polecenie: Program odpowiada numerem wersji Zaleca się zainstalowanie globalnej wersji node.js dostępnej dla wszystkich użytkowników oraz możliwej do uruchomianie a każdego miejsca w strukturze kartotek. Uruchomienie skryptu polega na wywołaniu programu node z parametrem określającym nazwę skryptu (gdy node.js jest zainstalowany lokalnie): >./node serwer.js
Repozytorium NPM Integralną częścią środkowiska NODE.JS, jest bogate repozytorium modułów (bibliotek), dzięki któremu mamy dostęp do wielu gotowych funkcji. http://npmjs.org/
Repozytorium NPM Integralną częścią środkowiska NODE.JS, jest bogate repozytorium modułów (bibliotek), dzięki któremu mamy dostęp do wielu gotowych funkcji. http://npmjs.org/
Repozytorium NPM Integralną częścią środkowiska NODE.JS, jest bogate repozytorium modułów (bibliotek), dzięki któremu mamy dostęp do wielu gotowych funkcji. http://npmjs.org/ Na stronie internetowej projektu można przeglądać i wyszukiwać pakiety, jednak ich instalacja odbywa się w poziomu wiersza poleceń: >./npm install nazwa-pakietu Pakiety instalują się w kartotece lib/node_modules.
Repozytorium NPM Integralną częścią środkowiska NODE.JS, jest bogate repozytorium modułów (bibliotek), dzięki któremu mamy dostęp do wielu gotowych funkcji. http://npmjs.org/ Na stronie internetowej projektu można przeglądać i wyszukiwać pakiety, jednak ich instalacja odbywa się w poziomu wiersza poleceń: >./npm install nazwa-pakietu Pakiety instalują się w kartotece lib/node_modules. Do globalnej instalacji pakietów NPM należy posiadać prawa administratora i wydać polecenie: >./npm -g install nazwa-pakietu
Repozytorium NPM >./npm install -g nazwa-pakietu
Obsługa żądań MODEL ZDARZENIOWY KLIENCI Żądanie HTTP Żądanie HTTP Żądanie HTTP... Żądanie HTTP SERWER Wątek W modelu zdarzeniowym Node.js wykorzystuje tylko jeden wątek do obsługi wielu żadąń, oraz pętlę zdarzeń co powoduje że aplikacja taka jest bardzo wydajna i skalowalna. W praktyce przy żadaniach które nie wymagają złożonych operacji obliczeniowych można obsłużyć nawet do 1 miliona żądań jednocześnie.
Pętla zdarzeń (Event loop) Żądanie HTTP Żądanie HTTP... Żądanie HTTP Rejestracja funkcji zwrotnej (callback) Pętla zdarzeń (Event Loop) Pojedyńczy wątek Request (req) Response (res) Wysłanie odpowiedzi w postaci wcześniej zarejestrowanej funkcji zwrotnej (callback). Zakończenie wykonania żądanej operacji przez serwer Serwer wykonuje np. : - operacje na plikach, - operacje bazodanowe, - obliczenia
Przykład prostego kodu (z strony nodejs.org) var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end('hello World\n'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); Prosty serwer przyjmujący żądania http
Przykład prostego kodu (z strony nodejs.org) var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end('hello World\n'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); Prosty serwer przyjmujący żądania http Załóżmy że powyższy kod jest zapisany w pliku serwer.js
Przykład prostego kodu (z strony nodejs.org) serwer.js Jeśli node.js został zainstalowany globalnie na komputerze, jego uruchomienie polega na wywołaniu z konsoli polecenia: > node Hello World serwer.js
Przykład prostego kodu (z strony nodejs.org) var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end('hello World\n'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); Po uruchomianiu tej aplikacji powstał serwer http oczekujący na żądania na porcie 1337.
Przykład prostego kodu (z strony nodejs.org) var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end('hello World\n'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); Po uruchomianiu tej aplikacji powstał serwer http oczekujący na żądania na porcie 1337. Po otrzymaniu żadania http serwer zwraca odpowiedź OK przesyłając do wyświetlenia zwykły tekst: Hello World, który jest widoczny w przeglądarce.
Przykład prostego kodu (z strony nodejs.org) var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/html'); res.end('<html><head></head><body>test</body></html>'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); We wcześniejszym przykłądzie serwer zwracał w odpowiedzi zwykły tekst, natomiast teraz zwraca dokument hipertekstowy ze statyczną stroną internetową.
Przykład prostego kodu (z strony nodejs.org) var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/html'); res.end('<html><head></head><body>test</body></html>'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); We wcześniejszym przykłądzie serwer zwracał w odpowiedzi zwykły tekst, natomiast teraz zwraca dokument hipertekstowy ze statyczną stroną internetową. Stworzyliśmy serwer obsługujący żądania HTTP!!!
Pętla zdarzeń (Event loop) Żądanie HTTP Żądanie HTTP... Żądanie HTTP Rejestracja funkcji zwrotnej (callback) Pętla zdarzeń (Event Loop) Pojedyńczy wątek Request (req) Response (res) Wysłanie odpowiedzi w postaci wcześniej zarejestrowanej funkcji zwrotnej (callback). Zakończenie wykonania żądanej operacji przez serwer Serwer wykonuje np. : - operacje na plikach, - operacje bazodanowe, - obliczenia
Moduły i obiekty var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end('hello world'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); We wcześniejszym przykłądzie serwer zwracał w odpowiedzi zwykły tekst, natomiast teraz zwraca dokument hipertekstowy ze statyczną stroną internetową. Stworzyliśmy serwer obsługujący żądania HTTP!!!
Moduły i obiekty var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end('hello world'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); Wróćmy do naszego prostego przykładu który spełniał rolę serwera http...
Moduły i obiekty var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end('hello world'); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); Wróćmy do naszego prostego przykładu który spełniał rolę serwera http... W języku JavaScript a tym samym w node.js wszystko jest obiektem i dlatego możemy zawsze obejrzeć podejrzeć każdy obiekt. Można to zrobić korzystając ze specjalnej biblioteki utils, którą można pobrać z repozytorium NPM: > npm -g install utils
Moduły i obiekty Dodajemy moduł za pomocą var http = require('http'); metody require. var utils = require('utils'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end(utils.inspect(req.headers)); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/');
Moduły i obiekty Dodajemy moduł za pomocą var http = require('http'); metody require. var utils = require('utils'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end(utils.inspect(req.headers)); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); Korzystamy z metody inspect() z modułu utils która zwraca postać obiektu w formie tekstu, który możemy wypisać.
Moduły i obiekty Dodajemy moduł za pomocą var http = require('http'); metody require. var utils = require('utils'); http.createserver(function (req, res) { res.writehead(200, {'Content-Type': 'text/plain'); res.end(utils.inspect(req.headers)); ).listen(1337, '127.0.0.1'); console.log('server running at http://127.0.0.1:1337/'); Korzystamy z metody inspect() z modułu utils która zwraca postać obiektu w formie tekstu, który możemy wypisać. Obiekt nagłówka żądania http
Moduły i obiekty var module = require('module_name'); Nazwa obiektu odnoszącego się do modułu Nazwa modułu Dzięki modułom można tworzyć zestawy metod (biblioteki), mogą być wykorzystane wielokrotnie w różnych aplikacjach.
Moduły i obiekty var module = require('module_name'); Nazwa obiektu odnoszącego się do modułu Nazwa modułu Dzięki modułom można tworzyć zestawy metod (biblioteki), mogą być wykorzystane wielokrotnie w różnych aplikacjach. Powstały w ten sposób obiekt jest niejako wskaźnikiem na dany moduł przez który możemy wywoływać z moduły dostępne metody i własności: module.zrobcos();
Moduły i obiekty function Kolo(x,y,r) { function pole() { return Math.pow(r,2)*Math.PI; return { pole: pole ; module.exports = Kolo; var kolo = require('./kolo'); console.log( kolo(3,4,2).pole() );
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie).
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma);
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); if( callback ) { callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma);
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); if( callback ) { callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); callback && callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); if( callback ) { callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); if( callback ) { callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Rejestracja wywołania zwrotnego Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); if( callback ) { callback(x,y); Wykonanie wywołania zwrotnego i odpowiedź function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Rejestracja wywołania zwrotnego Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); callback && callback(x,y); W ogólności function pomnoz(x,y){ callback jest var iloczyn = x*y; użyteczny kiedy jakaś console.log('iloczyn: '+ iloczyn); akcja musi zostać function dodaj(x,y){ wykonana zanim kod var suma = x+y; wywołania zwrotnego console.log('suma: '+ suma); zostanie wykonany. Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); callback && callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj); Jak zobaczyć asynchroniczność??
Callback Callback [wywołanie zwrotne] - jest to pojęcie które opisuje kod programu przekazany do funkcji w postaci argumentu, czekający na wykonanie w odpowiednim czasie (asynchronicznie). function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); callback && callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Wprowadźmy do naszego kody małe opóźnienie. Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj); Jak zobaczyć asynchroniczność??
Callback function Komunikat(x,y, callback ){ console.log( Czekamy na przed wykonaniem callbacka... ); settimeout( function() { console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); callback && callback(x,y);, 2000); // 2000[ms]= 2[s] function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback function Komunikat(x,y, callback ){ console.log( Czekamy na przed wykonaniem callbacka... ); settimeout( function() { console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); callback && callback(x,y);, 2000); // 2000[ms]= 2[s] function pomnoz(x,y){ var iloczyn = x*y; console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback function Komunikat(x,y, callback ){ console.log( Czekamy na przed wykonaniem callbacka... ); settimeout( function() { console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); callback && callback(x,y);, 2000); // 2000[ms]= 2[s] Funkcje zostały uruchomione function pomnoz(x,y){ zanim wykonane zostały var iloczyn = x*y; wywołania zwrotne console.log('iloczyn: '+ iloczyn); function dodaj(x,y){ var suma = x+y; console.log('suma: '+ suma); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Callback function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' callback && callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; settimeout(function() { console.log('iloczyn: '+ iloczyn);, 3500); function dodaj(x,y){ var suma = x+y; settimeout( function() { console.log('suma: '+ suma);, 1000); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj); + x + ' i y= ' + y); Teraz opóźniamy wykonanie samych funkcji obliczeniowych...
Callback function Komunikat(x,y, callback ){ console.log('wczytalem dwie liczby x= ' + x + ' i y= ' + y); callback && callback(x,y); function pomnoz(x,y){ var iloczyn = x*y; settimeout(function() { console.log('iloczyn: '+ iloczyn);, 3500); function dodaj(x,y){ var suma = x+y; settimeout( function() { console.log('suma: '+ suma);, 1000); Komunikat(4,5,pomnoz); Komunikat(7,5,dodaj);
Prototype - wzbogacanie obiektów var func = function(x,y){ this.x = x; this.y = y; this.pomnoz = function(){ return this.x * this.y;; ; var f = new func(4,7); func.prototype.pokazx = function(){ console.log(this.x); ; func.prototype.pokazy = function(){ console.log(this.y); ; func.prototype.dodaj = function(){ return this.x + this.y; ; func.prototype.pokazdodaj = function(){ console.log(this.dodaj()); func.prototype.pokazpomnoz = function(){ console.log(this.pomnoz()); f.pokazx(); f.pokazy(); f.pokazdodaj(); f.pokazpomnoz();