Gestire parametri GET in Server Node.js
Guida all’uso del modulo URL

Tempo di lettura: 5 minuti
Gestire routing su Node.js con il modulo URL e dati in GET

Stai imparando ad usare Node.js e hai creato il tuo primo web server che restituisce delle pagine HTML, ma adesso vuoi fare il passo successivo: vuoi gestire i parametri in GET e il routing delle pagine. In questo articolo ti spiegherò come farlo!

Partiamo dal codice del precedente esercizio: Come restituire pagine HTML con un server Node.js

var http = require('http'); 

var server = http.createServer(function(req, res) {
  res.writeHead(200, {"Content-Type": "text/html"});
  res.write('<!DOCTYPE html>'+
  '<html>'+
  ' <head>'+
  ' <meta charset="utf-8" />'+
  ' <title>Pagina Node.js!</title>'+
  ' </head>'+
  ' <body>'+
  '  <p>Sono un paragrafo <strong>HTML</strong>!</p>'+
  ' </body>'+
  '</html>');
  res.end();
});

server.listen(8080);

Restituisce un contenuto HTML ma è sempre lo stesso per ogni pagina!

Come gestire pagine diverse con Node.js?

Prova la nostra piccola app su diversi URL:

  • http://localhost:8080
  • http://localhost:8080/pagina1
  • http://localhost:8080/cartella/pagina2

Qualunque pagina sia chiamata… la pagina visualizzata è sempre la stessa!

Abbiamo bisogno di sapere quale pagina il visitatore ha richiesto. Dal momento che non stiamo facendo nessun controllo la nostra app restituisce sempre lo stesso contenuto.

Quello che dobbiamo fare è scoprire come recuperare:

  1. Il nome della pagina richiesta (/mypage, /page. html, /folder/ otherpage, ecc.)
  2. I parametri nell’URL (ad esempio: http://localhost:8080/mypage?lastname=doe&firstname=john)

Quale pagina ha richiesto il visitatore?

Per scoprire quale pagina ha richiesto il visitatore useremo un nuovo modulo Node chiamato “url”.

Puoi richiamarlo così:

var url = require("url");

Poi, tutto quello che dobbiamo fare è “analizzare” la richiesta del visitatore per ottenere il nome della pagina richiesta, in questo modo:

url.parse(req.url).pathname;

Ecco un semplice codice che ti permetterà di testare ciò che abbiamo detto finora:

var http = require('http');
var url = require('url');

var server = http.createServer(function(req, res) {
  var page = url.parse(req.url).pathname;
  console.log(page);
  res.writeHead(200, {"Content-Type": "text/plain"});
  res.write('Hey!');
  res.end();
});

server.listen(8080);

In primo luogo, esegui lo script e avvia il browser all’indirizzo http://localhost:8080 o 8081. Poi torna alla console, verrà registrato il nome della pagina richiesta.

Questo è quello che dovresti vedere:

parametri-get-server-node-gestire-routing-pagine
Esempio di uso del modulo URL per Node.js

Ho solo caricato la home page, perché vedo /favicon.ico?

La maggior parte dei browser esegue una seconda richiesta per recuperare l’icona del sito web (la “favicon” è quella piccola immagine nel nome della scheda).

Prova a caricare varie pagine con vari url per vedere cosa succede.

/testpage
/favicon.ico
/a/long/path/
/favicon.ico
/boguspage.html
/favicon.ico

Se ignoriamo la favicon.ico, che crea un po’ di confusione sulla console, possiamo vedere che il programma ha provato a caricare le pagine seguenti:

  • http://localhost:8080/testpage
  • http://localhost:8080/a/long/path
  • http://localhost:8080/boguspage.html

Ma il nostro sito sta ancora restituendo lo stesso contenuto indipendentemente dalla pagina chiamata!

Tutto quello che devi fare è scrivere una condizione e il lavoro è fatto!

var http = require('http');
var url = require('url');

var server = http.createServer(function(req, res) {
  var page = url.parse(req.url).pathname;
  console.log(page);
  res.writeHead(200, {"Content-Type": "text/plain"});
  if (page == '/') {
    res.write('Sei nella Reception. Posso aiutarti?');
  } else if (page == '/basement') {
    res.write('Sei nella cantina dei vini. Le bottiglie sono mie!');
  }  else if (page == '/floor/1/bedroom') {
    res.write('Oh, non dovresti essere qui!');
  }
  res.end();
});
server.listen(8080);

Copia questo codice ed inseriscilo in un file chiamato modulo-url.js, prova a lanciarlo e e guarda che succede.

modulo-url-nodejs-parametri-get-query
Routing manuale su Node.js

Piccolo esercizio extra: aggiungi a questo codice una if per gestire i messaggi di errore nel caso il visitatore richieda una pagina inesistente (non dimenticare di restituire un codice di errore 404!).

Cosa sono i parametri in GET?

I parametri GET vengono aggiunti alla fine dell’URL, dopo il percorso del file. Prendiamo ad esempio questo URL:

http://localhost:8080/page?firstname=Alberto&lastname=Olla

I parametri sono contenuti nella stringa ?firstname=Alberto&lastname=Olla. Per recuperare questa stringa, è sufficiente utilizzare:

url.parse(req.url).query

Il problema è che l’intera stringa verrà restituita senza prima dividere i diversi parametri.

Per fortuna esiste un modulo Node.js che se ne prende cura per noi, cioè querystring!

A questo punto devi includerlo nel tuo codice:

var querystring = require('querystring');

poi potrai fare:

var params = querystring.parse(url.parse(req.url).query);

A questo punto avremo una lista di parametri “params”. Per recuperare il valore del primo (il nome) basta scrivere: params[‘firstname’].

Diamo un’occhiata ad un codice completo che mostra il tuo nome e cognome (fintanto che questi sono stati definiti!):

var http = require('http');
var url = require('url');
var querystring = require('querystring');

var server = http.createServer(function(req, res) {
  var params = querystring.parse(url.parse(req.url).query);
  res.writeHead(200, {"Content-Type": "text/plain"});
  if ('firstname' in params && 'lastname' in params) {
    res.write('Il tuo nome: ' + params['firstname'] + ' ' + params['lastname']);
  } else {
    res.write('Tu hai un nome giusto?');
  }
  res.end();
});

server.listen(8080);

Prova ad andare a http://localhost:8080?firstname=Alberto&lastname=Olla per vedere il risultato e poi cambia il nome e il cognome con il tuo!

Due piccoli dettagli su questo codice:

  1. Il ‘firstname’ di params permette di verificare se l’array params contiene una voce ‘firstname’. Se manca puoi visualizzare un messaggio di errore, in caso contrario verrebbe mostrato il valore ‘undefined’, ovvero non definito.
  2. Inoltre, non abbiamo controllato la pagina chiamata. Questo codice funziona anche su http://localhost:8080 come su http://localhost:8080/imaginarypage. Questo e il codice precedente devono essere combinati per gestire sia la pagina che i parametri.

Composizione di un URL (Schema riepilogativo)

Prima di finire, una bella immagina riassuntiva di ciò che hai appena appreso.

modulo-url-nodejs-get-query-pathname
Modulo URL su Node.js: get, query, pathname

Conclusioni: come usare il modulo URL e gestire i parametri GET in Node.js?

  • Con Node.js devi gestire autonomamente il web server (Apache o simili) oltre alle classiche funzionalità del sito. Quindi devi gestire manualmente la scelta in base al nome della pagina richiesta ed eventuali i parametri passati.
  • Le librerie Node.js sono chiamate moduli e vengono caricate usando il metodo require().
  • Con Node.js inviamo spesso funzioni come parametri di altre funzioni (callback). In questo modo è possibile determinare quale funzione deve essere chiamata in seguito al termine di un’attività.
  • La tua applicazione di solito restituire HTML al browser del visitatore, per farlo puoi usare il metodo write().

 


L’articolo che hai appena letto fa parte di una lunga serie di guide e tutorial tradotte in italiano e distribuite gratuitamente. In particolare questo articolo si basa sui testi inglesi di Mathieu Nebra (Ultra fast applications using Node.js), con licenza CC BY-NC-SA. Questo articolo è sotto la stessa licenza.