lunedì, dicembre 15, 2014

Prendiamo l'Express per le applicazioni web in node.js

Express è un modulo di node.js che permette di sviluppare un'applicazione web in maniera semplice e pulita dal punto di vista architetturale.

Conosciamo tutti come funziona un classico sito web statico: facciamo una richiesta http con il browser ad un determinato indirizzo, il server risponderà inviandoci il contenuto di un file html presente in una cartella mappata con il particolare indirizzo richiesto; il server restituisce sempre, per ogni richiesta allo stesso indirizzo, lo stesso documento html.

Nel caso in cui volessimo una pagina html per visualizzare i 10 prodotti più venduti della settimana, in un ipotetico sito di vendite online, il discorso si complicherebbe: dovremmo prevedere l'utilizzo di una tecnologia lato server che ci permetta di generare dinamicamente il codice html necessario, magari andando ad interrogare una base dati per avere la lista dei prodotti richiesti.

Riprendiamo l'esempio di questo post, immaginando di voler ritonare un documento html completo, per osservare come saremmo già in grado di generare un html diverso a secondo della richiesta
 var http = require('http'),   
    url = require('url'),  
    html = '';  
     
  var server = http.createServer(function (req, res) {   
    var urlRichiesta = url.parse(req.url, true);   
    res.writeHead(200, {'Content-Type': 'text/html'});   
      
    html = '<!DOCTYPE html>';  
    html += '<html lang="en">';  
    html += '     <head>';  
    html += '          <meta charset="UTF-8">';  
    html += '          <title>Esempio server node</title>';  
    html += '     </head>';  
    html += '     <body>';  
    html += '          <p>';  
    html += '             Hello World: ' + urlRichiesta.query.nome  
    html += '          </p>';  
    html += '     </body>';
    html += '</html>'; 
   
    res.write(html);   
    res.end();   
  });   
     
  server.listen(8080, function() {   
    console.log("Server Web in ascolto su 8080 .....");   
  });   
Notate che abbiamo semplicemente variato il content-type della risposta e costruito l'intera risposta html all'interno di una stringa che viene inviato allo stream di destinazione.

Dovrebbe risultare chiaro che questo approccio va bene solo per semplici esempi come questo: nel caso di pagine più complesse, è buona norma separare la logica di business dalla logica di presentation.

Express ci aiuta proprio in questo, fornendoci gli strumenti per disegnare la nostra applicazione in maniera pulita e facile da manutenere: provate a modificare la risposta html nell'esempio precedente!

Cominciamo dunque a sviluppare un'applicazione web con express e node.js.

Creiamo una cartella vuota che sarà la cartella padre del nostro progetto web e creaiamo, al suo inteno, un file dal nome package.json con il seguente contenuto
 {  
  "name": "PrimaAppExpress",  
  "version": "0.0.1",  
  "private": "true",  
  "main": "app.js",  
  "dependencies": {  
     "express": "*"  
   }  
 }  
Ogni applicazione per node.js puo' specificare un file di questo tipo, per descrivere le proprietà del progetto e le dipendenze nei confronti di librerie esterne.

In questo caso, la nostra applicazione PrimaAppExpress
  1. ha una versione 0.0.1
  2. è un modulo privato (non censibile nel repository centralizzato di npm)
  3. il file principale che viene mandato in esecuzione è app.js
  4. dipende da modulo esterno express, ultima versione per la presenza del carattere '*', altrimenti indicare la versione esatta
Ora posizionamoci con una shell dos nella directory del progetto e digitiamo il comando npm install che provvederà a scaricare dal repository di npm, le varie dipendenze elencate nel file package,json; in questo casò solo il modulo express, che sarà copiato in una sottocartella dal nome node_modules

Ora creaiamo il file app.js
 var express = require('express');  
   
 var app = express();  
   
 app.get('/', function(req,res) {  
      res.end('Tutto ok!');  
 });  
   
 app.listen('8000', function() {  
      console.log('Server Web in ascolto su 8000 ...');  
 });  
In questo primo esempio, minimale, creaiamo un oggetto app utilizzando la funzione express() importata con l'istruzione require.

Definiamo poi la risposta da ritornare quando arriva la richiesta all'indirizzo '/', rappresentato da http://localhost:8000/ (localhost solo perchè il server è sulla stessa macchina fisica del browser),in questo caso ritorniamo semplicemente la stringa 'Tutto ok', solo per testare che tutto funzioni.

Non abbiamo ancora separato logica di business da logica di presentazione, ci mancano ancora un po' di concetti che affronteremo un passo alla volta.

Ho messo su github questo primo esempio di applicazione, quando copierete in locale il progetto, ricordatevi di eseguire npm install dalla cartella del progetto per scaricarvi il modulo express.

In questo post le istruzioni su come usare github, nel caso non lo abbiate mai usato.

Alla prox.
Ivan




2 commenti:

  1. ciao, è possibile ottenere lo stesso risultato senza ricorrere al modulo express? se si, come?

    RispondiElimina
    Risposte
    1. Dovresti utilizzare il modulo http come mostrato nel primo frammento di codice. ciao

      Elimina