Iniziamo ad utilizzare le funzioni Javascript

In questa lezione vedremo come sfruttare alcune API JavaScript di nostra conoscenza nel codice Node.js attraverso degli esempi molto semplici.

Headers HTTP

Se facciamo girare il server proposto a pagina precedente, probabilmente non vedremo nulla per i primi cinque secondi, e solo alla fine apparirà il contenuto completo. Ciò è corretto, perché solamente dopo cinque secondi eseguiamo l’istruzione response.end() che termina la trasmissione della risposta. Se però guardiamo alla consolle del server vedremo che continua a comparire il messaggio di log “I’m writing”. Anche questo è corretto perché la funzione response.write() continuerà ad essere eseguita ogni secondo come stabilito dalla setInterval, anche dopo il completamento della response HTTP.

Queste osservazioni sono correlate alla questione degli headers HTTP. Se apriamo uno strumento di sviluppo Web, come ad esempio Firebug su Firefox, possiamo verificare il valore degli headers della risposta HTTP. Molto probabilmente avremmo qualcosa del genere

 
headers_01

Figura 1 – Headers HTTP della risposta di Node.js

 

Da cui vediamo che, oltre all’ header specificato in maniera esplicita dal nostro codice (ovvero "Content-Type": "text/plain"), abbiamo anche i seguenti headers

 

 

questo ci dice innanzitutto che Node.js gestisce automaticamente alcuni degli header della risposta, che vengono ritornati al client usando i valori di default (quelli qui sopra). Il motivo della scelta riguarda sia le prestazioni del server, sia della trasmissione dei dati. Gli headers connection e transfer-encoding sono stati introdotti col protocollo HTTP 1.1. Il primo mantiene “viva” la connessione TCP/IP, permettendo così di usare la stessa connessione HTTP sopra TCP/IP nell’ambito di più richieste consecutive. Ciò aumenta le performance perché riduce il numero di volte che la connessione client-server viene aperta. Il secondo riguarda la modalità di trasferimento dei contenuti: il valore “chunked” indica che stiamo ricevendo i dati in modalità “streaming”, cioè man mano che sono disponibili. Questo modo di trasmettere i dati è opposto alla tecnica di “buffering”, che invece richiede al server di bufferizzare i dati prima di trasmetterli al client.

L’esempio presentato a pagina precedente è uno snippet a scopo puramente didattico, che non riesce a sfruttare appieno le potenzialità del protocollo HTTP 1.1. È anche per questo motivo che abbiamo sbirciato la configurazione dell’header e verificato la presenza delle voci “Connection” e “Transfer-Encoding”. Ciò fa capire che Node.js è potenzialmente in grado di trasmettere i dati man mano che diventano disponibili, evitando così di appesantire il server. Questa caratteristica sarà più evidente quando useremo l’oggetto socket, che al momento non è disponibile nella versione base di Node.js (versione 0.8.8 alla data di quest’articolo), ma richiede di essere installato manualmente. Nelle prossime lezioni vedremo come installare il modulo socket.io, e inizieremo a vedere come Node.js permetta di sfruttare il protocollo WS nella comunicazione client-server.