martedì, dicembre 16, 2014

Filtri per la pulizia in Express per node.js

Se state seguendo il mio blog, dovreste saperlo, ci tengo alla pulizia architetturale dei sistemi informativi.

Express eccelle da questo punto di vista, utilizzando il concetto di middleware: componenti software che intercettano la richiesta http per compiere una qualsiasi azione utile, attivabili e disattivabili in maniera semplice e trasparenti per la gestione finale della richiesta.


Osservando la figura, vediamo come la richiesta venga intercettata dal middleware di validazione, autenticazione, data parsing prima di essere gestita effetivamente dalla funzione di callback responsabile di creare la risposta finale; il middleware di validazione, ad esempio, controlla la presenza corretta di eventuali parametri, e se alcuni parametri non sono validi, puo' deviare il normale flusso di gestione della richiesta, altrimenti passa la palla al middleware successivo, senza ovviamente sapere qual è.

Esistono middleware standard inclusi nella distribuzione di express, middleware forniti da terze parti come moduli scaricabili con npm, possiamo anche definire i nostri middleware
 app.use(function(request, response, next) {  
   // eseguo la logica del middleware: es. valido i parametri e se tutto ok 
   // invoco la funzione next() che passa la richiesta al middleware successivo  
   // o alla funzione di callback finale definita in app.get(...)  
   next();  
 });  
Nel nostro programma app.js, tramite il metodo use() dell'oggetto app, attiviamo un particolare middleware, che non è altro che, guarda un po', una funzione di callback che accetta l'oggetto request, l'oggetto response e la funzione next per far proseguire il normale flusso di gestione della richiesta verso un particolare url; se per qualche motivo vogliamo interrompere tale flusso, abbiamo l'oggetto response per mandare una risposta immediata al client e non eseguiremo più la funzione next.

Come primo esempio, proviamo a definire un middleware di validazione parametro, che controlli la presenta del parametro dal nome totale che deve essere un intero: se la validazione fallisce ritorniamo una opportuna risposta deviando dal normale flusso di gestione della richiesta
 var express = require('express');  
   
 var app = express();  
   
 app.use(function(req,res,next) {  
      if (Number(req.query.totale))  
           next();  
      else  
           res.end('Usare un intero per il parametro totale!');  
 });  
   
 app.get('/', function(req,res) {  
      res.end('Tutto ok!');  
 });  
   
 app.listen('8000', function() {  
      console.log('Server Web in ascolto su 8000 ...');  
 });  
Provate ad effettuare una richiesta con browser del tipo http://localhost:8000 o http://localhost:8000/?totale=NonUnNumero e otterrete la risposta del middleware, altrimenti riceverete la risposta tutto ok.

Se vogliamo utilizzare diversi middleware, l'ordine con cui scriviamo i vari app.use(...) determina l'ordine di esecuzione.

Vediamo ora l'esempio di utilizzo di un middleware molto utile, presente nella distribuzione standard di express
 var express = require('express');  
   
 var app = express();   
   
 app.use(express.static('public'));  
   
 app.listen('8000', function() {  
      console.log('Server Web in ascolto su 8000 ...');  
 });  
express.static('public') ritorna un middleware, utilizzato dalla nostra app, che si preoccuperà di servire direttamente i file presenti nella cartella public che rappresenta effettivamente una cartella virtuale: se ad esempio qualcuno richiede http://localhost:8000/ verrà, di default, servita la pagina index.html presente nella cartella public; se qualcuno richiede http://localhost:8000/img/header.jpg verrà servita l'immagine presente in public/img/header.jpg.

La struttura dei file del nostro progetto è diventata così:


Tutte le risorse statiche (html, css, javascript da eseguire lato cliente, immagini) verranno servite direttamente dal middleware in questione.

Con queste semplici istruzioni, abbiamo implementato un server web statico perfettamente funzionante.

Con i prossimi post, vedremo come dinamicizzare le risposte.

Ho messo su github questo esempio di applicazione con middleware, 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.

E se avete dubbi sui filtri di pulizia, commentate :))

Alla prox.
Ivan

Nessun commento:

Posta un commento