venerdì, dicembre 05, 2014

Primo server web in node.js ... troppo difficile

Uno dei motivi per cui ho deciso di investire del tempo nello studio di node.js è la sua semplicità nell'implementare componenti complessi.

Provate a creare un server http in java, o peggio ancora in c :)

Signore e signori ecco un semplice server web che, per ora, risponde ad ogni richiesta con il classico hello world
 var http = require('http');  
   
 var server = http.createServer(function (req, res) {  
  res.writeHead(200, {'Content-Type': 'text/plain'});  
  res.write('Hello World\n');  
  res.end();  
 });  
   
 server.listen(8080, function() {  
      console.log("Server Web in ascolto su 8080");  
 });  

Creiamo un oggetto server con il metodo createServer del modulo http, implementiamo la funzione di callback che verrà eseguita ogni volta che arriva una richiesta e lo mettiamo in ascolto sulla porta che vogliamo (a patto che sia libera), in questo caso la 8080.

Eseguite il programma con l'interprete node, non appena il server è pronto a ricevere richieste, stamperà a video il messaggio Server Web in ascolto su 8080 così come specificato nella funzione di callback passata come parametro al metodo listen.



Per testare il server, puntate il browser all'indirizzo http://localhost:8080 e gongolatevi per la vostra bravura: un server http in meno di un minuto :))

Per spegnere il server, digitate ctrl + c sulla console

La funzione di callback che gestisce le richieste riceve due parametri req e res (sono parametri formali, potreste chiamarli anche ciccio e paperino, ma req e res mi sembra più chiaro...) che sono rispettivamente uno stream di lettura e uno stream di scrittura.

Prima di proseguire, poichè ogni modifica al programma server implicherebbe il riavvio manuale del server (con ctrl + c e poi node programma.js), installiamo a livello globale il modulo nodemon con il comando npm install -g nodemon.

D'ora in avanti, eseguiremo il nostro programma digitando nodemon programma.js, in questo modo ogni modifica al file programma.js causa un riavvio automatico del programma stesso, il che vi farà risparmiare del tempo in fase di sviluppo.


Proviamo a passare un parametro nome alla richiesta, quindi le nostre richieste saranno del tipo http://localhost:8080/?nome=ivan, vediamo come si leggono i parametri dalla richiesta per rendere dinamica la risposta
 var http = require('http'),  
     url = require('url');  
   
 var server = http.createServer(function (req, res) {  
     var urlRichiesta = url.parse(req.url, true);  
     res.writeHead(200, {'Content-Type': 'text/plain'});  
     res.write('Hello World: ' + urlRichiesta.query.nome);  
     res.end();  
 });  
   
 server.listen(8080, function() {  
      console.log("Server Web in ascolto su 8080 .....");  
 });  

Importiamo il modulo url che semplifica il parsing dell'indirizzo della richiesta.

Dalla documentazione ufficiale dell'oggetto req, notiamo che la proprietà req.url rappresenta l'indirizzo della richiesta corrente: /?nome=ivan, utilizzando il modulo url con il suo metodo parse, è possibile ottenere un oggetto con le singole parti costituenti l'indirizzo della richiesta, la nostra variabile urlRichiesta sarà dunque costituita dal seguente oggetto
{ 
   href: '/?nome=ivan',  
   search: '?nome=ivan',  
   query: { nome: 'ivan' },  
   pathname: '/' 
}  
Per estrarre il valore del parametro nome basterà allora navigare l'oggetto urlRichiesta.query.nome, otterremo cosi un saluto dinamico :).

E se i parametri sono due? Ad esempio http://localhost:8080/?nome=ivan&cognome=saracino? 
Basterà ovviamente navigare l'oggetto urlRichiesta.query.cognome.

Ora avete la vostra prima applicazione web, servita da node.js, in esecuzione sulla vostra macchina sulla porta 8080: e se volessimo rendere accessibile la nostra stupenda applicazione in internet senza usare un servizio di hosting esterno e soprattutto, gratis?

Installate il modulo ngrok con il comando npm install -g ngrok, dopo aver messo in esecuzione il vostro server http sulla porta 8080, digitate su un'altra console il comando ngrok 8080, comparirà sulla console un output di questo tipo


Prendete nota dell'indirizzo di forwarding, nel mio caso è http://3d723a32.ngrok.com: ora la vostra applicazione, in esecuzione in locale sullo porta 8080, è accessibile dall'esterno a quell'indirizzo, provate ad inserire nel browser http://vostroindirizzo?nome=ivan&cognome=saracino e vedrete la vostra applicazione in esecuzione.

Ovviamente il server deve essere in esecuzione, per interrompere il tunneling digitate ctrl+c sulla console dove avete mandato in esecuzione ngrok: ricordate però che alla prossima esecuzione l'indirizzo cambia: è un ottimo modo per far vedere una vostra applicazione che state sviluppando a qualcuno fuori dalla vostra rete aziendale o domestica che sia.

Abbiamo appena iniziato l'affascinante argomento dello sviluppo di applicazioni web in node.js: vedremo come utilizzare ulteriori moduli di node per rendere lo sviluppo ancora più immediato.

Ho aggiornato su github il progetto, effettuate un git pull per aggiornare i sorgenti che avete in locale, come mostrato in questo post

Come al solito, per dubbi e/o domande: commentate!

Alla prox.
Ivan

2 commenti:

  1. Ciao Ivan quindi se ho capito bene il modulo ngrok serve per farmi creare un indirizzo passandogli la porta dove risiede in locale la mia applicazione e una volta ottenuto questo indirizzo lo posso passare a qualcuno su un'altra macchina per far testare la mia app è corretto?

    RispondiElimina
    Risposte
    1. Corretto! E il qualcuno che testa puo' anche essere esterno alla tua rete locale, ovviamente appena spegni la tua app o ngrok, l'indirizzo non è più valido e al successivo riavvio di ngrok avrai un nuovo indirizzo.

      Elimina