Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Come avviare un server nodeJs, Dispense di Informatica

Breve descrizione di come avviare un server nodeJs

Tipologia: Dispense

2019/2020

In vendita dal 22/06/2020

andrea-racca
andrea-racca 🇮🇹

4.5

(2)

7 documenti

1 / 9

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
1.0 Web Worker
Un Web Worker è del codice JavaScript in esecuzione in background indipendentemente da altri script che
non influisce sulle performance della pagina web.
1.1 Funzionamento asincrono event-driven di Node.js
Node.js accede alle risorse del SO sfruttando il modello event-driven che non si basa su processi e thread
concorrenti, ma bensì sul modello ad eventi che consiste nell’eseguire un’azione al verificarsi di un certo
evento. Ogni azione è quindi asincrona e l’efficienza dell’applicazione è garantita da un sistema di callback
gestito a basso livello dal runtime. È molto efficiente per le azioni che riguardano il networking in quanto
devono di inviare una richiesta e rimanere in attesa per la risposta.
Per funzione di callback si intende una funzione che viene passata come parametro ad un'altra funzione.
Approccio Sincrono
var dato = ottieniDatoDaRemoto(url);
alert(dato);
Approccio Asincrono
ottieniDatoDaRemoto(url, function(dato) {
alert(dato);
});
Racca Andrea Rocco
Approccio Sincono e Asincrono
pf3
pf4
pf5
pf8
pf9

Anteprima parziale del testo

Scarica Come avviare un server nodeJs e più Dispense in PDF di Informatica solo su Docsity!

1.0 Web Worker

Un Web Worker è del codice JavaScript in esecuzione in background indipendentemente da altri script che

non influisce sulle performance della pagina web.

1.1 Funzionamento asincrono event-driven di Node.js

Node.js accede alle risorse del SO sfruttando il modello event-driven che non si basa su processi e thread

concorrenti, ma bensì sul modello ad eventi che consiste nell’eseguire un’azione al verificarsi di un certo

evento. Ogni azione è quindi asincrona e l’efficienza dell’applicazione è garantita da un sistema di callback

gestito a basso livello dal runtime. È molto efficiente per le azioni che riguardano il networking in quanto

devono di inviare una richiesta e rimanere in attesa per la risposta.

Per funzione di callback si intende una funzione che viene passata come parametro ad un'altra funzione.

Approccio Sincrono

var dato = ottieniDatoDaRemoto(url); alert(dato);

Approccio Asincrono

ottieniDatoDaRemoto(url, function(dato) { alert(dato); }); Approccio Sincono e Asincrono

1.2 Moduli nativi di Node.js

1.2.1 GLOBALS

Non è una vera e propria libreria, ma una serie di API richiamabili da qualsiasi punto dell’applicazione. Le

due funzioni più importanti sono require (per includere moduli aggiuntivi) e setTimeout e setInterval (per

lavorare con i timer).

1.2.2 URL

Questo modulo permette di lavorare con gli url, creandoli a partire da oggetti oppure parsandoli a partire

da stringhe. Il metodo più importante è parse, che trasforma un url in un oggetto.

1.2.3 HTTP

Oltre ad includere la classe bootstrap (http.Server) per avviare un server web, il modulo http include una

serie di oggetti che permettono di utilizzare il protocollo http.

1.2.4 FS

Questo modulo permette di lavorare con il file system della macchina, eseguendo tutte le operazioni tipiche

di questo ambito come ad esempio la copia, la rinominazione, la cancellazione, la lettura e la scrittura di file

e cartelle.

1.2.5 NET

Questo modulo permette agli sviluppatori più esperti di implementare applicazioni client-server a

prescindere dal protocollo HTTP ma sfruttando i socket come strumenti più a basso livello e lavorando

direttamente con le connessioni.

1.3 NPM (Node Packaged Module)

NPM è un repository di librerie scritte per essere utilizzate da Node.js. Oltre al respository, è anche un

comando (solo in ambiente UNIX) per scaricare e installare nuovi moduli da includere nelle applicazioni.

res.end(“HelloWorld”): si passa la stringa da inviare al client come risposta

server.listen(1337, '127.0.0.1'): pone in ascolto il server sulla porta e l’indirizzo IP indicati. Ad ogni richiesta

verrà richiamata la funzione di callback definita sopra.

1.6 Dispatcher

1.6.1 Cos’è un dispatcher?

Le applicazioni web espongono una serie di punti d’accesso per le varie funzionalità offerte che vengono

tradotte sotto forma di URL. In base all’URL richiamato dell’utente, l’applicazione si deve comportare in

modo diverso. Per realizzare questa funzione, si usa un Dispatcher, cioè un componente che permette di

differenziare le richieste che vengono effettuate dall’utente.

1.6.2 Realizzazione di un dispatcher

Esempio 1 (da GitHub)

var dispatcher = require('../httpdispatcher'); var http = require('http'); dispatcher.setStatic('/resources'); dispatcher.setStaticDirname('static'); dispatcher.onGet("/page1", function(req, res) { res.writeHead( 200 , {'Content-Type': 'text/plain'}); res.end('Page One'); }); dispatcher.onPost("/page2", function(req, res) { res.writeHead( 200 , {'Content-Type': 'text/plain'}); res.end('Page Two'); }); dispatcher.beforeFilter(/ / /, function(req, res, chain) { //any url console.log("Before filter"); chain.next(req, res, chain); }); dispatcher.afterFilter(/ / /, function(req, res, chain) { //any url console.log("After filter"); chain.next(req, res, chain); }); dispatcher.onError(function(req, res) { res.writeHead( 404 ); res.end(); }); http.createServer(function (req, res) { dispatcher.dispatch(req, res); }).listen( 1337 , '127.0.0.1');

Esempio 2 (da HTML)

Applicazione.js

var dispatcher = require('httpdispatcher'); dispatcher.onGet("/page1", function(req, res) { res.writeHead( 200 , {'Content-Type': 'text/plain'}); res.end('Page One'); }); dispatcher.onPost("/page2", function(req, res) { res.writeHead( 200 , {'Content-Type': 'text/plain'}); res.end('Page Two'); }); http.createServer(function (req, res) { dispatcher.dispatch(req, res); }).listen( 1337 , '127.0.0.1');

httdispatcher.js

var HttpDispatcher = function() { this.listeners = { get: [ ], post: [ ] }; this.errorListener = function() { } this.staticFolderPrefix = '/static'; } HttpDispatcher.prototype.setStatic = function(folder) { this.staticFolderPrefix = folder; } HttpDispatcher.prototype.staticListener = function(req, res) { var url = require('url').parse(req.url, true); var filename = require('path').join(".", url.pathname); var errorListener = this.errorListener; require('fs').readFile(filename, function(err, file) { if (err) { errorListener(req, res); return; } res.writeHeader( 200 , { "Content-Type": require('mime').lookup(filename) }); res.write(file, 'binary'); res.end(); }); } HttpDispatcher.prototype.dispatch = function(req, res) { var parsedUrl = require('url').parse(req.url, true); if (parsedUrl.pathname.indexOf(this.staticFolderPrefix) == 0) { this.staticListener(req, res); return; } var method = req.method.toLowerCase(); if (method == 'post') { var body = '';

1.7 Node.js e le richieste HTTP

Node.js permette di gestire il passaggio di parametri sia tramite metodo GET che POST.

Per estrarli tramite GET si usa questo codice:

var url_parts = require('url').parse(req.url, true); console.log(url_parts.query); // stamperà una mappa chiave/valore dei parametri

Poiché tramite POST i parametri sono nascosti, estrarli è più complicato. È possibile accedervi tramite due

eventi:

 data: generato più volte, ogni volta che viene ricevuta una porzione di dati

 end: generato una sola volta, alla fine della ricezione dei dati

var body = ''; req.on('data', function(data) { body += data; }); req.on('end', function() { var post = require('querystring').parse(body); console.log(post); });

Questi due eventi, inseriti all’interno del dispatcher (vedi Esempio 2) permettono di differenziare le

richieste GET e POST che arrivano al dispatcher.

1.8 Interfacciamento MySQL

Non esistono moduli nativi per l’interfacciamento con MySQL, ma si può utilizzare Node-db, un framework

che delega l’esecuzione delle query al DB.

Qualsiasi query è eseguita in modo asincrono definendo delle funzioni di callback.

Tramite dei metodi chiamati chain, è possibile scrivere delle query complesse direttamente da codice

sfruttando le API del framework senza doverle scrivere in SQL.

Esempio

var mysql = require('db-mysql'); new mysql.Database({ hostname: 'localhost', user: 'utentedb', password: 'passwdb', database: 'testdb' }).connect(function(error) { if(error) return console.log("Connection error"); this.query().select("*") .from("libri") .where("letto = ?", [true]) .order({ titolo: true }) .execute(function(error, rows, cols) { if (error) return console.log("Query error"); for (var i in rows) console.log(rows[i]); }); });

1.9 Hosting per Node.js

Gratuito:

1. Nodester

2. CloudNo

3. NodeSocket

Pagamento:

1. Heroku

2. Nodejitsu