wade 2017-2018 tutorial (1/3): web application development with node.js – an introduction

90
Dr. Sabin Buragaprofs.info.uaic.ro/~busaco Dezvoltarea aplicațiilor Web JavaScript la nivel de server – node.js (aspecte esențiale)

Upload: sabin-buraga

Post on 28-Jan-2018

45 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

Dezvoltarea aplicațiilor Web

⍟JavaScript la nivel de server – node.js

(aspecte esențiale)

Page 2: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

„Cine a văzut vreodată o bijuterie frumos cizelatăde bijutier cu ajutorul ciocanului?”

Jan Amos Comenius

Page 3: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

“Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven,

non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem – npm – is the largest

ecosystem of open source libraries in the world.”

“Node.js is designed to buildscalable network applications.”

Page 4: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

Ryan Dahl concepe Node.js (2009) – nodejs.org

rulează pe mașini respectând POSIX + Windows (2011)

adoptat de industrie (din 2012)e.g., Cloud9 IDE, eBay, Google, LinkedIn, Netflix, Storify, Twitter

hackernoon.com/@nodejs

Node.js Foundation (2015)IBM, Intel, Joyent, Microsoft, RedHat, SAP, The Linux Foundation,…

io.js – o variantă Node.js concepută în ES6 al cărei cod-sursă a fost încorporat în Node.js 4 (2015)

Node.js 6.11.4 LTS – Long Term Support (octombrie 2017)versiune stabilă actuală pentru uz în producție

Node.js 8.6.0 – varianta curentă (octombrie 2017)https://github.com/nodejs/node

Page 5: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js

Oferă un mediu de execuție în linia de comandă, pe baza unor biblioteci C++ și a procesorului V8

node program.js

Page 6: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js

Permite dezvoltarea de aplicații Web la nivel de server în limbajul JavaScript

recurge la V8 – procesor (interpretor) JavaScript creat de Google, implementat în C++ și disponibil liber

https://developers.google.com/v8/

Page 7: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

Oferă suport pentru cele mai importanteprotocoale Web și Internet

HTTP (HyperText Transfer Protocol)DNS (Domain Name System)

TLS (Transport Layer Security)functionalități de nivel scăzut (socket-uri TCP)

Page 8: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js

Page 9: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

Intern, se recurge la diverse biblioteci open source C sau C++

libuv (asynchronous I/O) – docs.libuv.org

c-ares (asynchronous DNS requests) – c-ares.haxx.se

OpenSSL (crypto & SSL/TLS) – www.openssl.org

zlib (compression) – zlib.net

V8 (JavaScript engine) – v8docs.nodesource.com

Page 10: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizareUzual, o aplicație Web realizează un număr mare de operații – în acest caz, asincrone – de intrare/ieșire

G. Yeh (2014): www.slideshare.net/garyyeh165/basic-understanding-and-implement-of-nodejs

Page 11: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

Operațiile de intrare/ieșire sunt asincrone

fiecare cerere (operație) adresată aplicației– e.g., acces la disc, la rețea, la alt proces – poate aveaatașată o funcție de tratare a unui eveniment specific

evented I/O

Page 12: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

cod JS executat declient (browser Web)

cod JS rulat pe parteade server (node.js)

așteaptă și trateazăevenimente de

interacțiune(onclick, onmouseover,

onkeypressed,…)

procesarebazată pe

evenimenteevented/

event-based

așteaptă și trateazăcereri (evenimente)

provenite de la client(i)

programul trebuie să fie responsiv atunci când

așteaptă încărcareadatelor de pe rețea

(e.g., JSON, XML, imagini, video) via Ajax/Comet

ori socket-uri Web

asincronism(e.g., operatiineblocante)

programul trebuie să fie responsiv atunci când

așteaptă încărcareadatelor locale/externe(preluate din baze de

date, fișiere, servicii Web, API-uri,…)

adaptare după Ben Sheldon (2012)

Page 13: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

O aplicație node.js rulează într-un singur proces

event loop ≡ “an entity that handles & processes externalevents and converts them into callback invocations”

http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

Page 14: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

O aplicație node.js rulează într-un singur proces

event loop ≡ “an entity that handles & processes externalevents and converts them into callback invocations”

codul JavaScript nu este executat paralel, dar tratează în mod asincron diverse evenimente I/O

http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

Page 15: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizareAplicația node.js „reacționează” la evenimente

context mai larg: reactive programming – http://reactivex.io/

G. Yeh (2014): www.slideshare.net/garyyeh165/basic-understanding-and-implement-of-nodejs

Page 16: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

O aplicație node.js rulează într-un singur proces

deosebire esențială față de serverele de aplicații Webtradiționale ce recurg la servere multi-process/threaded

Page 17: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

O aplicație node.js rulează într-un singur proces

server tipic server node.js

adaptare după Ben Sheldon (2012)

Page 18: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

bijoor.me/2013/06/09/java-ee-threads-vs-node-js-which-is-better-for-concurrent-data-processing-operations/

operații de intrare/ieșire sincrone versus

operații de intrare/ieșire asincrone

Page 19: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

HTTP: server Web

strongloop.github.io/strongloop.com/strongblog/node-js-is-faster-than-java/

Page 20: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

Mediul node.js e disponibil gratuit – open source –pentru platformele UNIX/Linux, Windows, MacOS

https://nodejs.org/en/download/

node.js: caracterizare

Page 21: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

funcționalități suplimentareoferite de module administrate cu npm – https://npmjs.org/

Page 22: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: caracterizare

Utilitarul npm poate gestiona dependențe imbricate

detalii la docs.npmjs.com

Page 23: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: exemplu

Un prim program care emite mesaje de salut

// salutari.js: un program (de sine-stătător) care emite un salut

console.log ('Salutari banale din Node.js');

invocarea uneimetode oferită de

un obiect predefinit

Page 24: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: exemplu

Un prim program care emite mesaje de salut

// salutari.js: un program (de sine-stătător) care emite un salut

console.log ('Salutari banale din Node.js');

> node salutari.js

Salutari banale din Node.js

Page 25: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

/* Un program JavaScript ilustrând comportamentul asincron

al operațiilor I/O implementate de Node.js */

var fs = require ('fs'); // acces la sistemul de fișiere

fs.readFile ('salutari.txt', 'utf-8', function (eroare, date) {

if (eroare)

throw eroare; // excepție de citire

console.log (date);

})

console.log ('Gata!');

execuția (cod interpretat) pornește de la prima linie a programului JavaScript

Page 26: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

/* Un program JavaScript ilustrând comportamentul asincron

al operațiilor I/O implementate de Node.js */

var fs = require ('fs'); // acces la sistemul de fișiere

fs.readFile ('salutari.txt', 'utf-8', function (eroare, date) {

if (eroare)

throw eroare; // excepție de citire

console.log (date);

})

console.log ('Gata!');

începe execuția unei operații asincrone(aici, citirea conținutului unui fișier text)

care returnează imediat

Page 27: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

/* Un program JavaScript ilustrând comportamentul asincron

al operațiilor I/O implementate de Node.js */

var fs = require ('fs'); // acces la sistemul de fișiere

fs.readFile ('salutari.txt', 'utf-8', function (eroare, date) {

if (eroare)

throw eroare; // excepție de citire

console.log (date);

})

console.log ('Gata!');

execuția continuă cu ultima linie de program

> node asincronism.js

Gata!

Page 28: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

/* Un program JavaScript ilustrând comportamentul asincron

al operațiilor I/O implementate de Node.js */

var fs = require ('fs'); // acces la sistemul de fișiere

fs.readFile ('salutari.txt', 'utf-8', function (eroare, date) {

if (eroare)

throw eroare; // excepție de citire

console.log (date);

})

console.log ('Gata!');

…după care sunt afișate datele preluate din fișier

> node asincronism.js

Gata!

Un prim salut...

Acesta este al doilea salut.

Page 29: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

// Un program JavaScript care salută toți posibilii săi clienți Web

var http = require ('http'); // folosim 'http', un modul Node predefinit

http.createServer ( // creăm un server Web

// funcție anonimă ce tratează o cerere și trimite un răspuns

function (cerere, raspuns) {

// afișăm la consola serverului mesaje de diagnostic

console.log ('Am primit o cerere...');

// stabilim valori pentru diverse câmpuri din antetul mesajului HTTP

raspuns.writeHead (200, { 'Content-Type': 'text/html' });

// emitem răspunsul propriu-zis conform tipului MIME (aici, cod HTML)

raspuns.end ('<html><body><h1>Salutari…</h1></body></html>');

}

// serverul ascultă cereri la portul 8080 al mașinii locale

).listen (8080, "127.0.0.1");

console.log ('Serverul creat asteapta cereri la http://127.0.0.1:8080/');

Page 30: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

pe partea de server – așteptare de cereri> node salutari-web.js

Serverul creat asteapta cereri la http://127.0.0.1:8080/

Am primit o cerere...

Am primit o cerere...

programul JavaScript creat funcționează ca un server Webpentru fiecare cerere emisă de un posibil client (browser,aplicație desktop etc.) conform modelului client/server

Page 31: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

pe partea de server – așteptare de cereri> node salutari-web.js

Serverul creat asteapta cereri la http://127.0.0.1:8080/

Am primit o cerere...

Am primit o cerere...

la client – recepționarea răspunsului conform cererii GETemise de un program desktop și de un navigator Web

> node client-salutari.js

Am primit raspuns de la server -- cod HTTP: 200

Continut receptionat: <html><body>

<h1>Salutari din Node.js</h1></body></html>

programul JavaScript creat funcționează ca un server Webpentru fiecare cerere emisă de un posibil client (browser,aplicație desktop etc.) conform modelului client/server

Page 32: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

// Un program JS care implementează un client pentru serviciul de salut

var http = require ('http');

http.get ('http://127.0.0.1:8080/', // emite o cerere HTTP

function (raspuns) {

console.log ('Am primit raspuns de la server -- cod HTTP: '

+ raspuns.statusCode); // statusCode: 200, 404,…

})

// tratăm diverse evenimente via funcții (eventual, anonime) de tip callback

.on ('error', // eroare

function (e) { console.log ('Eroare: ' + e.message); })

.on ('response', // receptare răspuns de la server

function (raspuns) { // există date de procesat

raspuns.on ('data', function (date) {

console.log ('Continut receptionat: ' + date);

});

}

);

Page 33: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module

Funcția require () specifică utilizarea unui modul Node.js

module predefinite (built-in):

privitoare la tehnologii Web – http, https, url, querystring

referitoare la fișiere – fs, path

vizând rețeaua – net, dns, dgram, tls,…resurse privind sistemul de operare – os, child_process

alte aspecte de interes – buffer, console, util, crypto

suport multi-core – cluster

Page 34: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module

documentația online aferentă

nodejs.org/en/docs/

devdocs.io/node/

Page 35: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: moduleatenție:

o parte dintre funcționalități sunt experimentale

nodejs.org/api/documentation.html

Page 36: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – http

Dezvoltarea de aplicații Web via modulul http

funcționalități HTTP de bază

crearea unui server Web: createServer()

realizarea de cereri HTTP: request() get()

Page 37: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – http

Dezvoltarea de aplicații Web via modulul http

servire de cereri HTTP – clasa http.Server

metode uzuale: listen() setTimeout() close()

evenimente ce pot fi tratate: request connect close clientError etc.

Page 38: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – http

Dezvoltarea de aplicații Web via modulul http

răspuns emis de server – clasa http.ServerResponse

metode uzuale: writeHead() getHeader() removeHeader() write() end() etc.

evenimente: close finish

proprietăți folositoare: statusCode headersSent

Page 39: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – http

Dezvoltarea de aplicații Web via modulul http

cerere emisă de client – clasa http.ClientRequest

metode uzuale: write() abort() end() setTimeout() setSocketKeepAlive()

evenimente ce pot fi tratate: response connect continue socket etc.

Page 40: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – http

Dezvoltarea de aplicații Web via modulul http

mesaj vehiculat – clasa http.IncomingMessage

metode: setEncoding() setTimeout() pause() resume()

evenimente ce pot fi tratate: data end close

proprietăți de interes: httpVersion headers method url statusCode socket

Page 41: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – url

Procesarea adreselor Web via modulul url

metode oferite: parse() format() resolve()

nodejs.org/api/url.html

Page 42: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

covar url = require ('url');

var adresaWeb = url.parse (

'http://undeva.info:8080/oferta/jucarii/produs/?nume=Tux&marime=17#descriere',

true // generează un obiect 'query' ce include câmpurile din querystring

);

console.log (adresaWeb);

if (adresaWeb['query'].marime > 13) {

console.log ('Jucaria e in regula.');

} else {

console.log ('Jucaria e stricata.');

}

Page 43: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

> node url.js

{ protocol: 'http:',

slashes: true,

auth: null,

host: 'undeva.info:8080',

port: '8080',

hostname: 'undeva.info',

hash: '#descriere',

search: '?nume=Tux&marime=17',

query: { nume: 'Tux', marime: '17' },

pathname: '/oferta/jucarii/produs/',

path: '/oferta/jucarii/produs/?nume=Tux&marime=17',

href: 'http://undeva.info:8080/oferta/jucarii/produs/?nume=…'

}

Jucaria e in regula.

Page 44: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – net

Crearea de aplicații Internet – modulul net

partea de server:

createServer()

+ clasa net.Server

metode: listen() close() address() getConnections()

evenimente: listening connection close error

Page 45: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – net

Crearea de aplicații Internet – modulul net

partea de client:

connect()

createConnection()

Page 46: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – net

Crearea de aplicații Internet – modulul net

acces la socket-uri – clasa net.Socket

metode: connect() write() setEncoding() destroy() end() etc.

evenimente: connect data end timeout drain error close

proprietăți utile: localAddress localPort

remoteAddress remotePort bytesRead bytesWritten bufferSize

Page 47: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – fs

Acces la sistemul de fișiere via modulul fs

metode folosite uzual – comportament asincron:

open() read() write() close()

truncate() stat() chmod() rename() exists()

isFile() isDirectory() isSocket()

mkdir() rmdir() readdir()

Page 48: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – fs

Acces la sistemul de fișiere via modulul fs

studiu de caz (Victor Porof, 2013 – absolvent FII): generare de liste de melodii via iTunes și Last.fm

(ilustrează și maniera de creare a modulelor proprii)

https://github.com/victorporof/plgen

Page 49: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

abstractizează accesul la date stocate parțial(partially buffered data)

se emit evenimente ce pot fi tratate de codul aplicației

Page 50: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

pot fi citite – stream.Readable

pot fi scrise – stream.Writable

duplex (citite și scrise) – stream.Duplex

realizând o transformare a datelor – stream.Transform

detalii la https://nodejs.org/api/stream.htmlmedium.freecodecamp.org/node-js-streams-everything-you-need-to-know-c9141306be93

Page 51: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

fluxuri ce pot fi citite (readable streams)e.g., create de fs.createReadStream() http.ServerRequest

http.ClientResponse net.Socket child.stdout process.stdin

Page 52: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

fluxuri ce pot fi citite (readable streams)e.g., create de fs.createReadStream() http.ServerRequest

http.ClientResponse net.Socket child.stdout process.stdin

emit evenimentele readable data end error

Page 53: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

fluxuri ce pot fi citite (readable streams)e.g., create de fs.createReadStream() http.ServerRequest

http.ClientResponse net.Socket child.stdout process.stdin

au asociate metodele pause() resume() destroy()

Page 54: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

fluxuri ce pot fi scrise (writeable streams)e.g., create de fs.createWriteStream() http.ServerResponse

http.ClientRequest net.Socket child.stdin process.stdout

Page 55: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

fluxuri ce pot fi scrise (writeable streams)e.g., create de fs.createWriteStream() http.ServerResponse

http.ClientRequest net.Socket child.stdin process.stdout

emit evenimentele drain error

Page 56: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

fluxuri ce pot fi scrise (writeable streams)e.g., create de fs.createWriteStream() http.ServerResponse

http.ClientRequest net.Socket child.stdin process.stdout

oferă metodele write() end() destroy()

Page 57: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

// Program ce preia ceea ce tastează utilizatorul la intrarea standard

// și scrie într-un fișier – conform M. Takada (2012)

var fs = require ('fs');

var fisier = fs.createWriteStream ('./spion.txt');

// la apariția datelor, le scriem în fișier

process.stdin.on ('data', function (date) { fisier.write (date); } );

// tratăm evenimentul de terminare a fluxului

process.stdin.on ('end', function() { fisier.end (); } );

// "reactivăm" intrarea standard; implicit, e în starea 'paused'

process.stdin.resume ();

obiectul process e global – detalii la nodejs.org/api/process.html

Page 58: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: fluxuri de date

Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

exemple de fluxuri de tip duplex:socket-uri TCP create cu net.Socket()

privind arhivele create cu zlib – nodejs.org/api/zlib.html

date criptate via crypto – nodejs.org/api/crypto.html

Page 59: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: rulare temporizată

Se poate planifica execuția codului JavaScript

recurgerea la funcțiile globalesetTimeout ()

clearTimeout ()

setInterval ()

clearInterval ()

Page 60: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

// creăm un server Web care trimite fiecărui client secvența valorilor unui contor

var server = http.createServer ().listen (8080, '127.0.0.1');

// stabilim un comportament la apariția evenimentului 'request' (cerere de la un client)

server.on ('request', function (cerere, raspuns) {

console.log ('Cerere de la clientul ' + cerere.headers['user-agent']);

raspuns.writeHead (200, { 'Content-Type': 'text/html' });

var contor = 0;

var interval = setInterval ( // generăm valori ale contorului conform intervalului de timp

function () {

raspuns.write ('<p>Contorul are valoarea ' + contor + '</p>');

console.log ('Contorul are valoarea ' + contor);

contor++;

if (contor >= 7) {

clearInterval (interval); // ștergem intervalul

raspuns.end (); // închidem fluxul de răspuns

console.log ('Am trimis raspuns clientului ' + cerere.headers['user-agent']);

}

}, 1000); // cod rulat la interval de 1000 milisecunde

});

Page 61: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

Cerere de la clientul … Mozilla/5.0 (Windows NT 10.0 …) … Firefox/56.0

Contorul are valoarea 0

Contorul are valoarea 1

Contorul are valoarea 2

Contorul are valoarea 3

Cerere de la clientul … Edge/14.14393

Contorul are valoarea 4

Contorul are valoarea 0

Contorul are valoarea 5

Contorul are valoarea 1

Contorul are valoarea 6

Am trimis raspuns clientului … Mozilla/5.0 (Windows NT 10.0 …) … Firefox/56.0

Contorul are valoarea 2

Contorul are valoarea 3

Contorul are valoarea 4

Contorul are valoarea 5

Contorul are valoarea 6

Am trimis raspuns clientului … Edge/14.14393

codul este rulatasincron

Page 62: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

Cerere de la clientul … Mozilla/5.0 (Windows NT 10.0 …) … Firefox/56.0

Contorul are valoarea 0

Contorul are valoarea 1

Contorul are valoarea 2

Contorul are valoarea 3

Cerere de la clientul … Edge/14.14393

Contorul are valoarea 4

Contorul are valoarea 0

Contorul are valoarea 5

Contorul are valoarea 1

Contorul are valoarea 6

Am trimis raspuns clientului … Mozilla/5.0 (Windows NT 10.0 …) … Firefox/56.0

Contorul are valoarea 2

Contorul are valoarea 3

Contorul are valoarea 4

Contorul are valoarea 5

Contorul are valoarea 6

Am trimis raspuns clientului … Edge/14.14393

browser-ul Web va aștepta ca întreaga secvență de valorisă fie trimisă de către serverde ce?

Page 63: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: evenimente

Emiterea (lansarea) și tratarea (prinderea)evenimentelor specificate de programator

se realizează via event.EventEmitter

clasă utilizată intern de multe biblioteci de bază

nodejs.org/api/events.html

Page 64: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module externe

Funcția require () specifică utilizarea unui modul Node.js

module disponibile on-line (instalate via utilitarul npm)

de studiat Understanding NPMhttps://unpm.nodesource.com/

Page 65: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module externe

Funcția require () specifică utilizarea unui modul Node.js

instalare globală a unui modul: npm install modul –g

listarea modulelor ce sunt instalate local: npm list

căutarea unui modul: npm search modul

eliminarea unui modul: npm uninstall modul

actualizarea unui modul: npm update modul

Page 66: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – acces la baze de date

Operații cu baze de date relaționale SQLite

recurgerea la modulul sql.js implementat în JavaScriptvia compilatorul emscripten

nu depinde de alte module

detalii la www.npmjs.com/package/sql.js

exemple demonstrative (interpretor SQL ca aplicație Web): http://kripken.github.io/sql.js/GUI/

Page 67: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module – studiu de caz

Dorim să realizăm un mini-robot care proceseazăconținutul diverselor resurse disponibile pe Web

rol de client pentru un server Web

prelucrează codul HTMLWeb scrapingmetode consacrate:

DOM (Document Object Model)SAX (Simple API for XML)

Page 68: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

var http = require ('http');

var qs = require ('querystring');

var dom = require ('xmldom').DOMParser;

// de exemplu, dorim să obținem reprezentarea corespunzătoare resursei

// de la http://www.google.ro/search?q=web+programming+node.js

var cerere = http.get ("http://www.google.ro/search?" +

qs.stringify ({ q: 'web programming node.js' }), function (raspuns) {

var rezultat = ''; // răspunsul poate sosi în fragmente de date

raspuns.on ('data', function (date) { // tratăm evenimentul privitor la

rezultat += date; // apariția datelor

});

// tratăm evenimentul de finalizare a transferului de date de la server

raspuns.on ('end', function() {

console.log (procesareHTML (rezultat));

});

});conectare la un server Web

Page 69: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

// realizează procesarea dorită (Web scrapping)function procesareHTML (document) {

var adrese = [ ]; // instanțiem un procesor DOMtry {var doc = new dom().parseFromString (document, "text/html");// preluăm toate elementele <a>var noduri = doc.getElementsByTagName ('a');// obținem valoarea atributului 'href' (URL-ul)for (var i = 0; i < noduri.length; i++) {

// plasăm în tablou doar dacă e relativ și e prefixat de "/url?q="var uri = noduri[i].getAttribute ('href');if (!uri.match (/^http(s?)/gi) && uri.match (/^\/url\?q=/g))

adrese.push (uri);}

} catch (e) { console.log (e.message); }return (adrese);

} procesare document cu DOMParserdeveloper.mozilla.org/DOMParser

Page 70: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: module

lista modulelor Node.jsnodejsmodules.org/

Page 71: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: framework-uri web

Uzual, încurajează dezvoltarea de aplicații Webîn care interacțiunea cu utilizatorulse realizează într-o singură pagină

(SPA – Single-Page Applications)

real-time single-page Web apps

Page 72: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: framework-uri web – exemple

Alte facilități notabile:

MVC (Model-View-Controller) și varianteletransfer de date în timp-real – e.g., cu Socket.IO

servicii Web – paradigma RESTsuport pentru baze de date NoSQL

machete de redare a conținutului (templates)

Page 73: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: framework-uri web – exemple

http://nodeframework.com/

Page 74: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: framework-uri web – connect

Framework extensibil de tip middlewarededicat deservirii de cereri HTTP

github.com/senchalabs/connect

Page 75: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: framework-uri web – connect

O cerere HTTP dată poate fi procesată – via use() –de una sau mai multe extensii (plugin-uri) specifice

această înlănțuire se denumește stivă (stack)

utilizarea unei extensii poate depinde de URL cereriidirijare (routing) – e.g., util în contextul REST

Page 76: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: framework-uri web – connect

Extensii utile:body-parser – procesări diverse

(e.g., text, date dintr-un formular Web, date JSON,…)compression – procesarea mesajelor compresate (gzip)

cookie-parser – prelucrarea de cookie-uricookie-session express-session – sesiuni Web

errorhandler – tratarea erorilormorgan – suport pentru jurnalizare (logging)

csurf – protecție CSRF (Cross-Site Request Forgery)serve-static – deservirea conținutului static (i.e. fișiere)

vhost – suport pentru găzduire virtuală

Page 77: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: framework-uri web – express

Framework minimalist ce încurajează dezvoltarea de aplicații Web

tradiționale – reprezentări multiple via hipermediabazate pe un unic punct de acces: SPA (Single Page App)

hibride (Web + aplicații native)

expressjs.com

Page 78: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

/│ app.js│ package.json├───bin├───data├───node_modules│ ├───body-parser│ ├───cookie-parser│ ├───debug│ ├───express│ │ ├───lib│ ├───jade│ ├───morgan├───public│ ├───images│ ├───javascripts│ └───stylesheets│ style.css├───routes│ index.js│ users.js└───views

error.jadeindex.jadelayout.jade

eșafodajul unei aplicații Web bazate pe Express

specificarea interfeței (view-ul)via machete de vizualizare descrise

cu JADE: http://jade-lang.com/

rute vizând deservirea cererilor pe baza URL-urilor solicitate de client

module Node.js adiționale

conținut static destinat clientului(e.g., foi de stiluri CSS, biblioteci JS procesate de browser, imagini,…)

diverse configurări ale aplicației

specificarea modelelor de date

Page 79: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: framework-uri web

MEAN (MongoDB, Express, Angular, Node.js) – mean.io

full stack Web developmentexemplificări:

devcenter.heroku.com/articles/mean-apps-restful-api

scotch.io/tutorials/creating-a-single-page-todo-app-with-node-and-angular

Page 80: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: suport es6

Node.js 4+ oferă suport pentru ECMAScript 2015 (ES6)

facilități deja incluse: declararea variabilelor cu let și const

specificarea claselorcolecții de date (Map, WeakMap, Set, WeakSet)

generatoriexecuție asincronă (Promises)

....

nodejs.org/en/docs/es6/

Page 81: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: suport es6

situația curentă a facilităților ECMAScript implementate de instrumente de conversie, navigatoare Web și Node.js

http://kangax.github.io/compat-table/es2016plus/

Page 82: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: suport es6

Node.js – starea actuală de implementare a facilităților oferite de ECMAScript: node.green

Page 83: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: utilizări pragmatice

Deservirea unui volum mare de conexiuniconcurente cu necesar minim de resurse

(procesor, memorie) într-un singur proces

Page 84: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: utilizări pragmatice

Procesarea în timp-real a datelor JSON oferite de API-uri (multiple)

inclusiv, crearea de aplicații oferind fluxuri de date (streaming data)

Page 85: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: utilizări pragmatice

Procesarea în timp-real a datelor JSON oferite de API-uri (multiple)

caz practic: redirectarea unui flux de mesaje Twitterspre dispozitive via PubNub (Marinacci, 2016)

www.pubnub.com/blog/2016-04-14-connect-twitter-and-pubnub-in-one-line-of-code-with-nodejs-streams/

Page 86: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: utilizări pragmatice

Dezvoltarea rapidă de servicii Web sau API-uri conform paradigmei REST

(REpresentational State Transfer)

câteva framework-uri pentru dezvoltarea de API-uri:actionHero.js, facet, Frisby, restify, restmvc, percolator,…

Page 87: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: utilizări pragmatice

Crearea de aplicații native (desktop) folosind tehnologii Web moderne precum HTML5

nw.js (fost node-webkit)utilizarea modulelor Node.js direct la nivel de DOM

http://nwjs.io/

Page 88: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: instrumente de dezvoltare

Mediu de dezvoltare tradițional (desktop)

exemplificări:Nodeclipse & Enide (pentru Eclipse)

www.nodeclipse.org

Node.js Tools for Visual Studiowww.visualstudio.com/vs/node-js/

Page 89: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

node.js: utilizări pragmatice

dezvoltare „în nori” de aplicații Web – e.g., Cloud9 și KodingS. Buraga, Cu codul în „nori” (2015) – www.slideshare.net/busaco/cu-codul-n-nori

Page 90: WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An Introduction

Dr.

Sab

in B

ura

ga

profs.in

fo.uaic.ro/~busa

co

rezumat

⍟dezvoltarea de aplicații Web la nivel de server

cu Node.js – caracteristici, module, exemple