MEAN Stack - Node.js, express - Instytut Informatyki Teoretycznej i

Transkrypt

MEAN Stack - Node.js, express - Instytut Informatyki Teoretycznej i
MEAN Stack - Node.js, express
MEAN Stack - Node.js, express
Technologie zarządzania treścią
dr inż. Robert Perliński
[email protected]
Politechnika Częstochowska
Instytut Informatyki Teoretycznej i Stosowanej
4 października 2016
1/55
Plan prezentacji
1
Wprowadzenie do MEAN Stack
2
NodeJS
npm
Wysołania zwrotne
3
ExpressJS
Obsługa formularzy, GET i POST
Przesyłanie plików
REST API
4
Źródła
MEAN Stack - Node.js, express
2/55
MEAN Stack
MEAN Stack - Node.js, express
3/55
MEAN Stack
MongoDB – darmowa, otwarta baza NoSQL, przechowuje dokumenty
w formacie JSON (BSON), dostarcza wsłasny język zapytań,
Express.js – framework JavaScript wspierający tworzenie aplikacji
MVC po stronie serwera, pozwala użytkownikom tworzyć trasy
(routes) i wykorzystywać szablony,
Angular.js – otwarty framework JavsScript wykorzystujący MVC do
tworzenia aplikacji internetowych działających po stronie klienta w
technologi SPA, wspierany i firmowany przez Google, obecnie
występuje w dwóch zupełnie odmiennych wersjach (1.5 i 2.0),
Node.js – środowisko JavaScript obsługujące operacje wejścia/wyjścia
sterowane zdarzeniami, działające po stronie serwera, bazujące na
silniku Google V8.
MEAN Stack - Node.js, express
4/55
MEAN Stack
MEAN Stack - Node.js, express
5/55
Zalety MEAN Stack
Jeden język do wszystkiego - cały zespół używa tylko JavaScript (na
serwerze jak i po stronie klienta), obiekty JavaScript po prostu
zapisujemy w MongoDB.
Można uruchomić niemal na każdym urządzeniu czy platformie - duża
przenośność kodu.
Technologia ta jest prawie zupełnie darmowa.
Bardzo dobre wsparcie dla przetwarzania w chmurze czy pojedynczych
funkcjonalności jako usług sieciowych, np. baz danych NoSQL
(compose.io czy mongolab.com). Można łatwo wykorzystać dostępne
usługi hostingowe, np. https://www.heroku.com.
MEAN Stack - Node.js, express
6/55
Node.js
https://nodejs.org/en/
platforma działająca po stronie serwera na bazie silnika Google Chrome V8,
zaprojektowany przez Ryana Dahl w 2009 roku,
ma służyć prostemu tworzeniu szybkich i skalowalnych aplikacji
internetowych,
open source,
całkowicie darmowe,
aplikacje napisane w Node.js działają na OS X, MS Windows i Linux’ie,
używane przez tysiące programistów na całym świecie.
/* Program Hello World w Node.js */
console.log("Hello World!");
MEAN Stack - Node.js, express
7/55
Node.js
zalecany do tworzenia aplikacji:
z dużą liczbą operacji wejścia/wyjścia,
strumieniowania danych, np. video,
Single Page Applications (SPA),
udostępniających API w formacie JSON,
z intensywną wymianą danych w czasie rzeczywistym na wielu
urządzeniach, np. portale społecznościowe,
nie zalecany przy aplikacjach intensywnie wykorzystujących procesor (CPU),
npm - system pakietów Node.js - największy zbiór bibliotek open source na
świecie (ponad 330 000) → łatwa produkcja aplikacji internetowych,
Node.js = środowisko uruchomieniowe + biblioteki JavaScript
wykorzystuje biblioteki libuv
MEAN Stack - Node.js, express
8/55
Cechy Node.js
Asynchroniczność i sterowanie zdarzeniami
Serwer wywołuje kolejne API, jedno po drugim.
Nie czeka na zakończenie wywołanej funkcji aby zwrócić dane.
Za wszystko odpowiada mechanizm obsługi zdarzeń.
Duża szybkość - silnik Chrome V8 zapewnia dużą szybkość w wykonywaniu kodu.
Jednowątkowość z zachowaniem dużej skalowalności
Node.js używa modelu jednowątkowego z pętlą zdarzeń.
Potrafi obsłużyć znacznie więcej żądań niż tradycyjne serwery (np. Apache).
Mechanizm zdarzeń pomaga serwerowi na udzielanie odpowiedzi w sposób
nieblokujący,
pozwala to na wysoką skalowalność.
W klasycznych serwerach jest tworzona ograniczona liczba wątków obsługujących
żądania.
Licencja - Node.js jest tworzony na licencji MIT.
Projekty, aplikacjie, firmy - długa lista wykorzystywania Node.js: eBay, General
Electric, GoDaddy, Microsoft, PayPal, Uber, Wikipins, Yahoo, Yammer...
MEAN Stack - Node.js, express
9/55
libUV
https://github.com/libuv/libuv
międzyplatformowa biblioteka skupiająca się na asynchronicznych operacjach
wejścia/wyjścia,
stworzona pierwotnie dla Node.js, używana obecnie przez: Luvit, Julia, pyuv
i inne,
niektóre cechy:
wydajna pętla obsługująca zdarzenia,
asynchroniczna obsługa gniazd TCP i UDP,
asynchroniczna obsługa plików i systemu plików,
obsługa sygnałów, obsługa zdarzeń systemu plików,
zegar wysokiej rozdzielczości
MEAN Stack - Node.js, express
10/55
Najważniejsze części Node.js
Najważniejsze części Node.js przedstawiono na rysunku:
MEAN Stack - Node.js, express
11/55
Pełna lista modułów Node.js
Dokumentacja Node.js, v5.10.0
Assertion Testing
Child Processes
Console
DNS
Events
HTTP
Net
Process
Readline
String Decoder
TTY
Utilities
MEAN Stack - Node.js, express
Buffer
Cluster
Crypto
Domain
File System
HTTPS
OS
Punycode
REPL
Timers
UDP/Datagram
V8
C/C++ Addons
Command Line Options
Debugger
Errors
Globals
Modules
Path
Query Strings
Stream
TLS/SSL
URL
VM
ZLIB
12/55
Obiekty globalne w Node.js
Obiekty globalne w Node.js są dostępne we wszystkich modułach, nie trzeba ich w
żaden sposób dołączać.
filename - nazwa pliku, którego kod jest wykonywany, zawra całą ścieżkę,
dirname - nazwa katalogu wraz z całą ścieżką, w którym znajduje się
wykonywany plik,
setTimeout(cb, ms) - uruchamianie funkcji zwrotniej po określonej liczbie ms,
clearTimeout(t) - zatrzymywanie licznika czasu utworzonego wcześniej funkcją
setTimeout(),
setInterval(cb, ms) -uruchamianie funkcji zwrotnej co określoną liczbę ms.
function printHello(){
console.log( "Hello, World!");
}
// Wywołanie funkcji po upływie 2 s
var t = setTimeout(printHello, 2000);
// Usunięcie licznika czasu
clearTimeout(t);
MEAN Stack - Node.js, express
13/55
Obiekty globalne w Node.js
Inne często wykorzystywane obiekty globalne to:
console - drukowanie wiadomości w różnych poziomach błędu na stdout albo stderr,
zawiera metody:
log(), info(), warn(), error(), dir(), trace(), assert() - wyświetlanie wiadomości
informacyjnych w różny sposób,
console.time(label) - zapamiętuje punkt czasowy związany z etykietą,
console.timeEnd(label) - koniec przedziału czasowego z wiązanego z podaną
etykietą, wyświetla przedział czasu,
process - obiekt może emitować następujące zdarzenia:
exit - emitowane tuż przed zakończeniem procesu,
beforeExit - emitowane kiedy Node opróżnił już pętle zdarzeń i nie ma innych zadań,
uncaughtException - emitowane, kiedy eskalacja wyjątków wróci aż do pętli zdarzeń,
zdarzenia konkretnych sygnałów - emitowane, kiedy system otrzyma konkretne
zdarzenia, np. SIGINT, SIGHUP, ...
Procesy mają też szereg użytecznych
właściwości: stdout, stderr, stdin, argv, execPath, execArgv, env, exitCode, version,
versions, config, pid, title, arch, platform, mainModule,
metod: abort(), chdir(directory), cwd(), exit([code]), getgid(), setgid(id), getuid(),
setuid(id), getgroups(), setgroups(groups), initgroups(user, extra group), kill(pid[,
signal]), memoryUsage(), nextTick(callback), umask([mask]), uptime(), hrtime().
MEAN Stack - Node.js, express
14/55
Użyteczne moduły w Node.js
Najbardziej powszechnie i często używane moduły Node.js:
moduł os (Operating System) - podstawowe infomacje związane z systemem operacyjnym
(pamięć, procesor, ...)
moduł path - przechowywanie i przetwarzanie ścieżek plików i katalogów,
moduł net - pozwala na tworzenie zarówno serwerów jak i klientów, łączenie się,
przesyłanie informacji w postaci strumieniowej,
moduł dns - pozwala na obsługę DNS (sprawdanie adresów, różne typy adresów DNS,
kody błędów),
moduł domain - pozwala na wychwytywanie nieobsłużonych błędów.
var os = require("os");
console.log('endianness : ' + os.endianness());
console.log('type : ' + os.type());
console.log('platform : ' + os.platform());
console.log('total memory : ' + os.totalmem() + " bytes.");
console.log('free memory : ' + os.freemem() + " bytes.");
endianness : LE
type : Linux
platform : linux
total memory : 8110882816 bytes.
free memory : 4815204352 bytes.
MEAN Stack - Node.js, express
15/55
REPL Terminal
Read Eval Print Loop (REPL) - środowisko komputerowe, np. Linux Shell, w którym
polecenia są automatycznie przetwarzane i wyniki są wyświetlane w trybi interakcyjnym.
Node.js też ma takie środowisko:
Read - wczytuje dane od użytkownika, parsuje do struktur JavaScript i
przechowuje w pamięci,
Eval - bierze wprowadzone dane i je oblicza, wyznacza wartości,
Print - wyświetla wyniki,
Loop - trzy powyższe przetwarza w pęltli aż do dwukrotnego nacieśnięcia Ctrl+c.
$ node
> 1 + ( 2 * 3 ) - 4
3
> a = 12 // zachowane w zmiennej i wyswietlone
12
> var b = 12 // zachowane w zmiennej ale nie wyswietlone (var)
undefined
> (a+b)*2
48
> console.log(a+b)
24
undefined
MEAN Stack - Node.js, express
16/55
REPL Terminal - wiele linii i
mamy możliwość pisania wyrażeń składających się z wielu linii,
symbol podkreślenia ( ) zwraca ostatni wynik:
> x = 5
5
> while(x>0) {
... --x;
... console.log(x);
... }
4
3
2
1
0
undefined
> x+8
8
> _
8
MEAN Stack - Node.js, express
17/55
REPL Terminal - polecenia
Ctrl+c - przerywanie aktualnego polecenia,
Ctrl+c dwa razy - zamykanie Node REPL,
Ctrl+d - zamykanie Node REPL,
Klawisze Góra/Dół - historia polecenie, potrzednie/następne polecenie,
klawisz Tab - lista aktualnych komend,
.help - lista wszystkich komend,
.break albo .clear - wyjście z wieloliniowego wyrażenia,
.save nazwaPliku - zapis sesji Node REPL do pliku,
.load nazwaPliku - wczytanie zawartości pliku do bieżącej sesji.
MEAN Stack - Node.js, express
18/55
npm
npm - menadżer pakietów dla node.js (dla JavaScript).
zbiór pakietów/modułów dla Node.js dostępnych online:
https://www.npmjs.com/
narzędzie do instalacji pakietów Node.js, zarządza wersjami i
zależnościami pakietów Node.js
dokumnetacja - https://docs.npmjs.com/
najczęściej instalowane pakiety: npm, express, less, browserify, pm2, ...
$
$
$
$
npm --version
sudo npm install npm -g
npm install <Nazwa Modułu>
npm install express
MEAN Stack - Node.js, express
19/55
npm - globalna i lokalna instalacja modułów
Pakiety lokalne:
domyślnie pakiety instalowane są lokalnie w katalogu node modules
w folderze, w którym jest aplikacja Node.js,
lokalne pakiety są dostępne poprzez metodę require(),
lista lokalnych pakietów/modułów: npm ls.
Pakiety globalne:
globalne pakiety znajdują się w strukturze systemu plików komputera,
nie można ich wczytać używając require(),
instalacja pakietu globalnie: npm install express -g,
lista globalnych pakietów: npm ls -g.
MEAN Stack - Node.js, express
20/55
Tworzenie pakietu
Tworzenie pakietu: npm init
polecenie pyta o najważniejsze dane pakietu (proponując domyślne wartości),
tworzony jest plik package.json, np.:
{
"name": "rest",
"version": "1.0.0",
"description": "hello world restfull api",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"restfull"
],
"author": "rperlinski",
"license": "ISC"
}
MEAN Stack - Node.js, express
21/55
Plik package.json
package.json - plik odpowiedzialny za zarządzanie lokalnie zainstalowanymi
pakietami:
przechowuje informacje o zależnościach w naszym projekcie,
pozwala określić wersje pakietów których używa nasz projekt,
pozwala na odtworzenie naszej aplikacji - łatwość w dzieleniu się naszym
projektem
Minimum pliku package.json to nazwa i wersja:
{
"name": "moj-pakiet",
"version": "1.0.0"
}
MEAN Stack - Node.js, express
22/55
Tworzenie pakietu, instalacja
Instalacja pakietów
mkdir rest; cd rest
npm init - inicjalizacja, tworzy plik package.json
npm install express, albo lepiej
npm install --save express - dodaje zależności do pliku
package.json:
...
"license": "ISC",
"dependencies": {
"express": "^4.13.4"
}
}
MEAN Stack - Node.js, express
23/55
Atrybuty w pliku package.json
name - nazwa pakietu, atrybut obowiązkowy, tylko małe litery, jedno
słowo - nie ma spacji, dopuszczalne myślniki (-) i podkreślenia ( ),
version - wersja pakietu, atrybut obowiązkowy,
description - opis pakietu,
homepage - strona domowa pakietu,
author - autor pakietu,
contributors - współautorzy pakietu,
dependencies - lista zależności, npm automatycznie instaluje wszystkie
podane zależności w katalogu node modules naszego pakietu,
repository - typ repozytorium i URL pakietu,
main - punkt wejściowy pakietu,
keywords - słowa kluczowe.
MEAN Stack - Node.js, express
24/55
Inne polecenia npm
npm uninstall express - odinstalowanie modułu express,
npm update express - wywoływane po zmianach w pliku package.json,
autoamtycznie aktualizuje zależności,
npm search express - wyszukiwanie pakietów korzystając z polecenia npm,
npm init - generowanie pliku package.json co tworzy nowy moduł/pakiet,
npm adduser - dodanie użytkownika do repozytorium npm (nazwa i
poprawny email) i następnie można ...
npm publish - publikowanie naszego pakietu, będzie można go instalować
poleceniem npm install :)
MEAN Stack - Node.js, express
25/55
Wywołania zwrotne I
Wywołanie zwrotne (ang. callback) - technika programowania będąca
odwrotnością wywołania funkcji.
Użytkownik rejestruje funkcję do późniejszego wywołania.
Funkcje biblioteki wywołają ją w stosownym czasie.
Zwykle to programista sam wywołuje funkcje dostarczane przez bibliotekę.
Wywołanie zwrotnie:
asynchroniczny odpowiednik funkcji,
jest wykonywane kiedy zakończy się pewne zadanie,
kawałek wykonywalnego kodu, który przekazywany jako argument do innego
kodu, od którego oczekujemy, że wywoła przekazany kod w odpowiednim
czasie.
Node używa tego bardzo intensywnie.
Duża część API do Node jest tak napisana, aby wspierać wywołania zwrotne.
MEAN Stack - Node.js, express
26/55
Wywołania zwrotne II
Programy z funkcjami synchronicznymi:
wykonują się sekwencyjnie,
z punktu widzenia programisty łatwiej implementować logikę aplikacji.
Programy działające asynchronicznie:
nie wykonują się sekwencyjnie,
jeśli fragment kodu potrzebuje określonych danych powinien być
umieszczony w tym samym bloku kodu, żeby wykonanie tych
zależnych od siebie instrukcji było sekwencyjne.
MEAN Stack - Node.js, express
27/55
Wywołania zwrotne na przykładzie
Odczyt z pliku może być:
synchroniczny - czekamy na zwrócenie danych zawartych w pliku,
asynchroniczny:
funkcja zaczyna czytać plik ale ...
od razu zwraca sterowanie,
wykonywane są kolejne instrukcje;
zakończenie odczytywania danych z pliku wykonuje wywołanie zwrotne,
jako parametr przekazywana jest zawartość pliku,
nie ma tutaj blokowania.
Wniosek:
wysoka skalowalność Node.js (nawet 1 mln żądań na sekundę),
przetwarzanie dużej liczby żądań bez oczekiwania na zwrócone wyniki.
MEAN Stack - Node.js, express
28/55
Podwójne API Node.js
File System - metody asynchroniczne
fs.access(path[, mode], callback)
fs.close(fd, callback)
fs.exists(path, callback)
fs.read(fd, buffer, offset, length, position, callback)
fs.unlink(path, callback)
...
File System - metody synchroniczne
fs.accessSync(path[, mode])
fs.closeSync(fd)
fs.existsSync(path)
fs.readSync(fd, buffer, offset, length, position)
fs.unlinkSync(path)
...
MEAN Stack - Node.js, express
29/55
Wywołania zwrotne - odczyt z pliku, przykład
wywołanie synchroniczne
var fs = require("fs");
var data = fs.readFileSync('dane.txt');
console.log(data.toString());
console.log("Koniec programu");
Litwo, Ojczyzno moja! ty jesteś jak zdrowie;
Ile cię trzeba cenić, ten tylko się dowie, ...
Koniec programu
wywołanie asynchroniczne
var fs = require("fs");
fs.readFile('dane.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("Koniec programu");
Koniec programu
Litwo, Ojczyzno moja! ty jesteś jak zdrowie;
Ile cię trzeba cenić, ten tylko się dowie, ...
MEAN Stack - Node.js, express
30/55
Pierwszy projekt w Node.js
Większość aplikacji Node.js składa się z 3 części:
import wymaganych modułów - używa się dyrektywy require,
utworzenie serwera - serwer będzie oczekiwał na żadania klientów i zwracał
odpowiedzi,
odczytywanie żądań i zwracanie odpowiedzi - podstawowe działanie serwera.
var http = require("http");
var server = http.createServer(function (request, response) {
// Wysyłanie nagłówków protokołu HTTP
// Status HTTP: 200 : OK, Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// Wysyłanie ciała odpowiedzi, niezależnie od rodzaju żądania
response.end('Pierwszy projekt w Node.js\n');
});
server.listen(5000);
console.log('Server działa na http://127.0.0.1:5000/');
MEAN Stack - Node.js, express
31/55
Serwer sieciowy
Serwer sieciowy:
aplikacja obsługująca żądania HTTP przesyłane od klientów, np.
przeglądarki, w odpowiedzi zwracająca strony internetowe,
zwykle dostarczane są dokumenty HTML razem z obrazkami, stylami
CSS i skryptami,
większość serwerów obsługuje skrypty po stronie serwera w jednym z
wielu języków,
serwery wykonują określone zadania, pobierają dane z bazy,
przetwarzają skomplikowaną logikę ...
przykładem może być serwer Apache.
MEAN Stack - Node.js, express
32/55
Architektura aplikacji internetowej
Klasyczny podział aplikacji internetowej na cztery warstwy:
Klient - przeglądarki internetowe (w tym z urządzeń mobilnych) i aplikacje
wykonujące żądania HTTP,
Serwer internetowy - przechwytuje żadania od klientów i zwraca im odpowiedzi,
Warstwa biznesowa - zawiera aplikację serwerową wykorzystywaną przez serwer
internetowy; komunikuje się z warstwą danych,
Dane - zawiera dane w bazie danych albo dostępnych z innego źródła.
MEAN Stack - Node.js, express
33/55
Tworzenie serwera z użyciem Node.js i http
var http = require('http');
var fs = require('fs');
var url = require('url');
http.createServer( function (request, response) {
// Parsuje żądanie zawierające nazwę pliku
var pathname = url.parse(request.url).pathname;
// Wyświetlanie nazwy pliku, którego dotyczyło żądanie
console.log("Request for " + pathname + " received.");
fs.readFile(pathname.substr(1), function (err, data) {
if (err) {
console.log(err);
response.writeHead(404, {'Content-Type': 'text/html'});
} else {
response.writeHead(200, {'Content-Type': 'text/html'});
response.write(data.toString()); // zwracanie treści wybranego pliku
}
response.end(); // wysyłanie odpowiedzi
});
}).listen(5000);
console.log('Serwer uruchomiony na http://127.0.0.1:5000/');
MEAN Stack - Node.js, express
34/55
Tworzenie serwera z użyciem Node.js
index.html
<html>
<head>
<title>Pierwszy projekt</title>
</head>
<body>
Pierwszy projekt w Node.js
</body>
</html>
$ node server.js
Serwer uruchomiony na http://127.0.0.1:5000/
Otwieramy w przeglądarce: http://localhost:5000/index.html
MEAN Stack - Node.js, express
35/55
Tworzenie klienta z użyciem Node.js i http
var http = require('http');
// Opcje użyte w żądaniu
var options = {
host: 'localhost', port: '5000', path: '/index.html'
};
// Funkcja zwrotna obsługująca zwrócone dane
var callback = function(response){
// Dopisywanie napływających danych do strunienia
var body = '';
response.on('data', function(data) {
body += data;
});
response.on('end', function() {
// Wypisanie danych po ich otrzymaniu w pełni
console.log(body);
});
}
// Wysłanie żądania do seerwera
var req = http.request(options, callback);
req.end();
MEAN Stack - Node.js, express
36/55
Tworzenie klienta z użyciem Node.js
Wywołanie aplikacji klienta w innym terminalu, wynik działania:
$ node client.js
<html>
<head>
<title>Pierwszy projekt</title>
</head>
<body>
Pierwszy projekt w Node.js
</body>
</html>
MEAN Stack - Node.js, express
37/55
Express
http://expressjs.com/
Express to szybki, elastyczny (nie wymuszający konkretnych rozwiązań),
minimalistyczny szablon aplikacji internetowych i mobilnych dla Node.js.
Express:
udostępnia solidną funkcjonalność do budowania aplikacji,
pozwala na szybkie budowanie aplikacji bazujących na Node.js,
pozwala na utworzenie warstw pośredniczących odpowiadających na
żądania HTTP,
dostarcza mechanizm trasowania (ang. routing) - różne akcje dla
różnych metod i adresów URL,
pozwala na dynamiczne renderowanie stron HTML poprzez
przekazywanie argumentów do szablonów.
MEAN Stack - Node.js, express
38/55
ExpressJS i warstwy pośrednie
Instalacja: npm install express
ExpressJS to komplenty framework.
Działa z szablonami (jade, ejs, handlebars, hogan.js)
i kompilatorami CSS (less, stylus, compass).
Dzięki wartstwom pośredniczącym (oprogramowanie pośredniczące)
obsługuje również: ciasteczka, sesje, buforowanie, CSRF, kompresję i
wiele innych.
Oprogramowanie pośredniczące:
łańcuch/stos programów przetwarzających każde żądanie do serwera.
Takich programów w stosie może być dowolna liczba,
przetwarzanie odbywa się jeden po drugim.
Niektóre z nich mogą zmieniać żądanie, tworzyć logi czy inne dane,
przekazywać je do następnych (next()) programów w strumieniu.
MEAN Stack - Node.js, express
39/55
Express-middlewares
Warstwy pośredniczące dodajemy do ExpressJS używając app.use dla
dowolnej metody albo app.VERB (np. app.get, app.delete, app.post,
app.update, ...)
MEAN Stack - Node.js, express
40/55
Express - instalacja
$ npm install express --save
Inne ważne moduły, które warto od razu zainstalować:
body-parser - warstwa pośrednia obsługująca JSON, Raw, Text i
dane formularza przekazane w URL,
cookie-parser - przetwarza nagłówki ciasteczek (cookie header) i
dodaje obiekt do req.cookies, w którym klucze to nazwy
przesłanych ciasteczek,
multer - warstwa pośrednia w Node.js do obsługi
multipart/form-data (kodowanie danych z formularza).
MEAN Stack - Node.js, express
41/55
Express, Hello World
hello.js
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(5000, function () {
var host = server.address().address
var port = server.address().port
console.log("Przykładowa aplikacja nasłuchuje na http://%s:%s", host, port)
})
Wynik:
$ node hello.js
Otwieramy w przeglądarce: http://localhost:5000/
Przykładowa aplikacja nasłuchuje na http://0.0.0.0:5000
Express używa funkcji zwrotnych z argumentami req i res (obiekty request
i response), które zawierają bardzo dużo informacji i żądaniu i odpowiedzi.
MEAN Stack - Node.js, express
42/55
Express, trasowanie I
Reakcje na żądania użytkowników w punktach końcowych (URI, metody protokołu HTTP).
var express = require('express');
var app = express();
app.get('/', function (req, res) {
console.log("Otrzymano żądanie GET dla strony głównej");
res.send('Hello GET');
})
app.post('/', function (req, res) {
console.log("Otrzymano żądanie POST dla strony głównej");
res.send('Hello POST');
})
app.delete('/usun', function (req, res) {
console.log("Otrzymano żądanie DELETE dla strony /usun");
res.send('Hello DELETE');
})
app.get('/user_list', function (req, res) {
console.log("Otrzymano żądanie GET dla strony /user_list");
res.send('Lista użytkowników');
})
app.get('/ab*cd', function(req, res) {
// wzorzec strony: abcd, abxcd, ab123cd, ...
console.log("Otrzymano żądanie GET dla strony /ab*cd");
res.send('Wzorzec strony dopasowany');
})
var server = app.listen(5000, function () {
var host = server.address().address
var port = server.address().port
console.log("Przykładowa aplikacja nasłuchuje na http://%s:%s", host, port)
})
MEAN Stack - Node.js, express
43/55
Express, trasowanie II
Kolejne żądania:
GET
POST
DELETE
GET
GET
GET
GET
GET
-
http://localhost:5000/
http://localhost:5000
http://localhost:5000/usun
http://localhost:5000/user_list
http://localhost:5000/abcd
http://localhost:5000/ab123cd
http://localhost:5000/abXXcd
http://localhost:5000/abcdef
//
//
//
//
//
//
//
//
Hello GET
Hello POST
Hello DELETE
Lista użytkowników
Wzorzec strony dopasowany
Wzorzec strony dopasowany
Wzorzec strony dopasowany
Cannot GET /abcdef
Reakcja serwera:
http://localhost:5000/ Przykładowa aplikacja nasłuchuje na http://0.0.0.0:5000
Otrzymano żądanie GET dla strony głównej
Otrzymano żądanie POST dla strony głównej
Otrzymano żądanie DELETE dla strony /usun
Otrzymano żądanie GET dla strony /user_list
Otrzymano żądanie GET dla strony /ab*cd
Otrzymano żądanie GET dla strony /ab*cd
Otrzymano żądanie GET dla strony /ab*cd
MEAN Stack - Node.js, express
44/55
Express, statyczne pliki
Express posiada wbudowaną warstwę pośrednią express.static, która pozwala na udostępnianie
statycznych plików (obrazy, CSS, HTML, JavaScript, ...)
Wystarczy przekazać nazwę katalogu, z którego pliki będą dostępnę poprzez serwer:
app.use(express.static(’public’));
var express = require('express');
var app = express();
app.use(express.static('public'));
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(5000, function () {
var host = server.address().address
var port = server.address().port
console.log("Przykładowa aplikacja nasłuchuje na http://%s:%s", host, port)
})
Wywołanie: http://localhost:5000/npmLogo.png
wyświetli odpowiedni plik znajdujący się w katalogu public.
MEAN Stack - Node.js, express
45/55
Formularze, metoda GET
form get.js
var express = require('express');
var app = express();
app.get('/get.html', function (req, res) {
res.sendFile( __dirname + "/" + "get.html" );
})
app.get('/form_get', function (req, res) {
response = {
imie:req.query.imie,
nazwisko:req.query.nazwisko
};
console.log(response);
res.end(JSON.stringify(response));
})
app.listen(5000);
get.html
<html>
<body>
<form action="http://127.0.0.1:5000/form_get" method="GET">
Imie: <input type="text" name="imie"> <br>
Nazwisko: <input type="text" name="nazwisko">
<input type="submit" value="Wyślij">
</form>
</body>
</html>
MEAN Stack - Node.js, express
46/55
Formularze, metoda POST
form post.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false }) // application/x-www-form-urlencoded
app.use(express.static('public'));
app.post('/form_post', urlencodedParser, function (req, res) {
response = {
imie:req.body.imie,
nazwisko:req.body.nazwisko
};
console.log(response);
res.end(JSON.stringify(response));
})
app.listen(5000);
post.html
<html>
<body>
<form action="http://127.0.0.1:5000/form_post" method="POST">
Imie: <input type="text" name="imie"> <br>
Nazwisko: <input type="text" name="nazwisko">
<input type="submit" value="Wyślij">
</form>
</body>
</html>
MEAN Stack - Node.js, express
47/55
Formularze, przesyłanie plików I
file upload.js
var express = require('express');
var bodyParser = require('body-parser');
var multer = require('multer');
var app = express();
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
var upload = multer({ dest: 'uploads/' }).single('file');
app.post('/file_upload', function(req, res) {
upload(req, res, function (err) {
if (err) {
// błąd przy wczytywaniu/przesyłaniu pliku
return
}
// wszystko poszło dobrze
console.log(req.file); // req.file zawiera opis przesyłanego pliku
console.log(req.body); // req.body przechowuje pola tekstowe, jeśli takie były
response = {
message:'Plik wczytany poprawnie',
filename:req.file.filename,
originalname:req.file.originalname,
mimetype:req.file.mimetype,
size:req.file.size
};
res.end( JSON.stringify( response ) );
})
})
var server = app.listen(5000);
MEAN Stack - Node.js, express
48/55
Formularze, przesyłanie plików II
file.html
<html>
<head>
</head>
<body>
Wybierz plik do wysłania: <br />
<form action="http://127.0.0.1:5000/file_upload" method="POST"
enctype="multipart/form-data">
<input type="file" name="file" size="50" /> <br>
<input type="submit" value="Wyślij plik" />
</form>
</body>
</html>
MEAN Stack - Node.js, express
49/55
Express, cookie-parser
https://github.com/expressjs/cookie-parser
$ npm install cookie-parser
cookies.js
var express
= require('express')
var cookieParser = require('cookie-parser')
var app = express()
app.use(cookieParser())
app.get('/', function(req, res) {
console.log("Cookies: ", req.cookies)
})
app.listen(5000);
Wynik:
$ curl http://127.0.0.1:5000 --cookie "name=Jan;pozd=Hello"
Cookies:
{ name: 'Jan', pozd: 'Hello' }
MEAN Stack - Node.js, express
50/55
API, metoda GET
server.js
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/listUsers', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
console.log( data );
res.end( data );
});
})
app.listen(5000);
Żądanie: http://localhost:5000/listUsers
{
"user1" : { "name" : "johnw", "password" : "dogville321",
"profession" : "film_director", "id": 1 },
"user2" : { "name" : "Halina", "password" : "MojeHaslo123",
"profession" : "pisarka", "id": 2 },
"user3" : { "name" : "jnowak", "password" : "wiosna2016",
"profession" : "malarz", "id": 3 }
}
MEAN Stack - Node.js, express
51/55
API, metoda GET, konkretny użytkownik
server.js
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/:id', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
users = JSON.parse( data );
var user = users["user" + req.params.id]
console.log( user );
res.end( JSON.stringify(user));
});
})
app.listen(5000);
Żądanie: http://localhost:5000/1
{
"name":"johnw", "password":"dogville321",
"profession":"film_director", "id":1
}
MEAN Stack - Node.js, express
52/55
API, metoda POST
server.js
...
var user = {
"user4" : {
"name" : "kim2l", "password" : "a2vxZH45Xr",
"profession" : "programmer", "id": 4 }
}
app.get('/addUser', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
data["user4"] = user["user4"];
console.log( data );
res.end( JSON.stringify(data));
});
})
...
Żądanie: http://localhost:5000/addUser
{
...
"user4" : { "name" : "kim2l", "password" : "a2vxZH45Xr",
"profession" : "programmer", "id": 4 }
}
MEAN Stack - Node.js, express
53/55
API, metoda DELETE
server.js
...
var id = 2;
app.get('/deleteUser', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
delete data["user" + id];
console.log( data );
res.end( JSON.stringify(data));
});
})
...
Żądanie: http://localhost:5000/deleteUser
{
"user1" : { "name" : "johnw", "password" : "dogville321",
"profession" : "film_director", "id": 1 },
"user3" : { "name" : "jnowak", "password" : "wiosna2016",
"profession" : "malarz", "id": 3 }
}
MEAN Stack - Node.js, express
54/55
Źródła
https://nodejs.org/en/
https://en.wikipedia.org/wiki/Node.js
http://expressjs.com/
https://en.wikipedia.org/wiki/Express.js
http://www.tutorialspoint.com/nodejs/index.htm
https://www.npmjs.com/
https://github.com/libuv/libuv
https://en.wikipedia.org/wiki/Callback_(computer_programming)
MEAN Stack - Node.js, express
55/55