Come creare un server HTTP con Node.js
Un semplice web server
con il modulo HTTP

Tempo di lettura: 6 minuti
Creare un web server http con Node.js, esercizio pratico

Creare la tua prima applicazione con Node.js

Andremo a creare una vera e propria web app con Node.js, dall’inizio alla fine!

Avrai una prova concreta del perché ho definito Node.js una tecnologia di “basso livello” e delle differenze tra Node gli altri linguaggi di programmazione lato server, andremo a gestire tutte le parti del web server, dalle richieste HTTP all’output delle pagine HTML.

Sarà una fantastica occasione per sperimentare le temute callback di cui ti ho già parlato (sono le funzioni che vengono eseguite non appena si verifica uno specifico evento, per maggiori info guarda l’articolo sulle callback). Ti avviso, Node è pieno di callback quindi non potrai evitare di usarle!

È ora di lavorare seriamente! Sei pronto?

Questo è uno dei capitoli più importanti perché introduce numerosi concetti fondamentali, la maggior parte dei quali saranno nuovi per te!

Ti consiglio di metterti comodo e leggere in un posto tranquillo, fai tutte le pause che vuoi, e non sarebbe male rileggerlo dopo qualche giorno per assimilare meglio tutti i nuovi concetti.

Costruisci il tuo web server

Abbiamo parlato parecchio sulla teoria che sta dietro Node, adesso è arrivato il momento di farti vedere il tuo primo server HTTP scritto in Node.js:

var http = require('http');

var server = http.createServer(function(req, res) {
  res.writeHead(200);
  res.end('Ciao a tutti, sono un web server!');
});
server.listen(8080);

Possiamo dire che è il requisito minimo di ogni web app scritta in Node. Copia il codice e mettilo in un file chiamato server.js.

codice-javascript-per-creare-server-http-nodejs
Codice Javascript per creare un server http con Node.js

Cosa farà mai questo codice?

Crea un piccolo web server che, per ogni richiesta ricevuta, invia il messaggio “Ciao a tutti…“. Il server è accessibile alla porta 8080 (dato che siamo in fase di test).

Analizziamo il codice

Scomponiamo il codice riga per riga e cerchiamo di capirlo, partiamo dalla prima:

var http = require('http');

La funzione require consente di richiamare delle librerie esterne al nostro codice. In questo caso la libreria http che ci restituirà i metodi necessari per creare il nostro web server. Ci sono tante librerie come questa, alcune sono già incluse dentro Node mentre altre possiamo scaricarle usando l’NPM, il gestore di pacchetti di Node. js (non preoccuparti, impareremo a usarlo tra qualche capitolo).

La variabile http rappresenta l’oggetto JavaScript che ci permetterà di lanciare il server web e possiamo farlo in questo modo:

var server = http.createServer();

Chiamiamo il metodo createSever() contenuto nell’oggetto http e salviamo il risultato nella variabile server. Avrai notato che il metodo createServer prende in ingresso dei parametri, e guarda caso il parametro che gli abbiamo passato è proprio una funzione. È proprio questo che aumenta la complessità del codice:

var server = http.createServer(function(req, res) {
  res.writeHead(200);
  res.end('Ciao a tutti, sono un web server!');
});

Tutte queste 4 righe corrispondono ad una singola chiamata del metodo createServer()!

La funzione di callback che gli stiamo passando verrà richiamata nel momento in cui un visitatore si connetterà al sito.

Per chiarezza, volevo farti notare che il codice può essere scritto anche in un altro modo. Se preferisci possiamo definire la funzione di callback in una variabile e poi passarla a createServer(). In questo modo il codice risulta più comprensibile, ma il funzionamento resterà identico.

// Stesso risultato del codice precedente

var instructionsNewVisitor = function(req, res) {
  res.writeHead(200);
  res.end('Ciao a tutti, sono un web server!');
});

var server = http.createServer(instructionsNewVisitor);

(Tra i due codici è preferibile scrivere il primo, più in linea con lo stile di programmazione usato su Node.)

Probabilmente la funzione di callback ti sembrerà qualcosa di strano ma sappi che è uno dei concetti più importanti di Node.js, e lo userai tantissimo!

Nei codici Node ci sono callback ovunque, solitamente vengono definite come funzioni anonime e passate come parametri ai vari metodi (proprio come ti ho fatto vedere nel primo codice).

Lo so, inizialmente può sembrare difficile da leggere, ma ti assicuro che ben presto imparerai ad usarle.

Torniamo alla prima versione del nostro codice, quella che devi imparare a leggere.

Non dimenticare di chiudere correttamente la funzione di callback con la parentesi graffa e successivamente di chiudere le parentesi che contengono la funzione per poi inserire il punto e virgola. Sto parlando di questo });

La funzione callback viene chiamata ogni volta che un visitatore si collega al sito web e riceve due parametri in ingresso:

  • Richiesta del visitatore (req nel codice): questo oggetto contiene tutte le informazioni della richiesta del visitatore, ad esempio il suo IP, l’url che vuole visitare, se ha passato GET o POST e cosi via.
  • La risposta (res nel codice): questo è l’oggetto che conterrà la risposta restituita dal server al browser del visitatore. In questo caso abbiamo inserito un testo, solitamente contiene un codice HTML o, in caso di API dei dati JSON.

La nostra risposta per il momento è molto semplice, esegue queste due righe:

res.writeHead(200);
res.end('Ciao a tutti, sono un web server!');

Probabilmente sei abituato a web server che restituiscono codice HTML, in realtà oltre a quello restituiscono tante altre informazioni (molto tecniche) che vengono inserite in una sorta di “intestazione” della risposta.

Quel codice 200 si riferisce proprio all’intestazione, e serve per dire al browser “Tutto ok amico, la pagina è questa”, esistono tanti codici per diverse necessità, come il 404 che viene usato quando la pagina non esiste.

Ecco, hai appena avuto un’altra prova di quanto Node.js sia di basso livello!

Tuttavia, scrivere questo genere di codici non è un male, anzi dato che tu devi imparare le basi è perfetto per te. Una volta che avrai imparato a padroneggiare Node potrai passare a strumenti di più alto livello come Express e simili, ma questo lo vedremo più avanti.

Torniamo al nostro codice!

Terminiamo la risposta con end(), che invierà il messaggio e l’intestazione al browser. Per il momento non inviamo neanche un codice HTML ma bensì una semplice scritta.

Per concludere, dobbiamo mettere in ascolto il nostro server verso una porta, la porta 8080, con l’ istruzione:

server.listen(8080);

Piccola nota: la porta standard quando si vuole contattare un web server è la 80. Quando vai su google.it in realtà stai contattando il server di google alla porta 80. Per il momento sei in un ambiente di sviluppo (il tuo computer) quindi puoi usare la porta 8080 oppure la 8081. Nel momento in cui vorrai pubblicare la tua web app Node.js dovrai modificare la porta su 80, sarà a questa porta che i visitatori contatteranno il tuo server.

Verifichiamo che il server HTTP funzioni

È arrivato di momento di testare il nostro server!
Apri il terminale, posizionati nella cartella che contiene il file e lancia questo comando:

node server.js

La console non visualizzerà nulla e sembrerà bloccata – è del tutto normale!

avviare-server-nodejs-da-terminale-in-ascolto-porta-8080
Il server resta in ascolto alla porta indicata

Ora apri il tuo browser e vai all’indirizzo http://localhost:8080. In questo modo il browser contatterà il server Node, che è in esecuzione locale proprio alla porta 8080. Dovresti ottenere un risultato come questo:

server-http-nodejs-localhost-test-del-server-porta-8080
Il server Node.js risponde!

Se è così vuol dire che tutto ha funzionato correttamente, hai creato il tuo primo web server HTTP con Node.js, complimenti!

Se dovessi avere dei problemi il motivo potrebbe essere la porta già occupata quindi: ferma l’esecuzione del codice node, modifica la porta da 8080 a 8081, rilancia il server e visita la nuova pagina http://localhost:8081 .

Probabilmente avrai notato che il terminale sembra quasi bloccato, in realtà non è cosi, funziona perfettamente e “regge” il nostro web server.

Fai questa prova: interrompi l’esecuzione dello script, puoi farlo con CTRL + C su Windows o CTRL + D su Mac e Linux. Adesso prova ad aggiornare la pagina del browser.

server-http-node-non-funziona-impossibile-raggiungere-il-sito
Bloccando lo script da terminale il nostro Server non risponde più

Ti dirà che non riesce a contattare il server. Ti spiego: il web server funziona solo se lo script rimane in esecuzione, per questo il terminale sembrava “bloccato”, in realtà era in attesa di altri utenti da gestire.

Ti consiglio di effettuare qualche test modificando il codice, ad esempio puoi stampare la variabile req o aggiungere dei console.log; insomma divertiti e sperimenta, è il miglior modo per imparare le cose!

Nel prossimo articolo vedremo come far restituire al nostro server Node.js dei contenuti HTML, esattamente come un vero sito web!


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.