In Node.js una richiesta HTTP segue un preciso percorso prima di concludersi con una risposta da parte del server.

Una richiesta HTTP viene effettuata da un client (tipicamente un browser) verso il server chiedendo un URL specifico di una risorsa.

Se avete implementato un reverse proxy con un web server come nginx o Apache, la richiesta viene interpretata inizialmente dal web server, che quindi provvede ad inoltrarla internamente alla vostra app in Node.js, solitamente in ascolto all'indirizzo di loopback del vostro server su una porta specifica. In caso contrario, la richiesta raggiunge direttamente la vostra app.

A differenza di quanto avviene con i web server tradizionali, Node.js ha bisogno che voi dichiarate espressamente quali percorsi (path) e URL dovrà gestire e con quali verbi HTTP (GET, POST, PUT ecc.). In caso contrario, la richiesta HTTP non verrà gestita.

I percorsi iniziano dall'origine comune indicata con un singolo forward slash (/), che rappresenta il punto di inizio di tutti gli URL della vostra applicazione. Tali percorsi sono tutti relativi a tale punto di inizio. Alcune informazioni sull'host disponibili in linguaggi come PHP non sono disponibili in Node.

Oltre al percorso, in Node una richiesta HTTP usa due risorse fondamentali: gli oggetti request e response. Il primo gestisce le informazioni in ingresso (header HTTP inviati dal client, percorso richiesto ecc.) e il secondo gestisce la risposta da inviare al client che termina la sessione HTTP.

Ad esempio request.originalUrl contiene il percorso richiesto dal client, mentre response.end() termina la sessione HTTP.

Una transazione HTTP in Node è inoltre basata sugli eventi. Ad esempio sia l'oggetto request che response hanno un evento error che ci permette di gestire eventuali errori che si potrebbero verificare durante la connessione o all'atto di inviare una risposta.

La documentazione ufficiale di Node.js mostra come gestire una richiesta HTTP senza l'ausilio di un framework (ad esempio ExpressJS) sia un'operazione estremamente prolissa. Per gestire una richiesta HTTP in ExpressJS è sufficiente invece scrivere:

'use strict';
const app = require('express')();

app.get('/', (req, res) => {
    res.set('Content-Type', 'text/plain');
    res.send('It works!');
});

app.listen(8080);

In questo caso Express gestisce la richiesta GET alla home page della nostra applicazione. Gli oggetti req (request) e res (response) vengono estesi con l'aggiunta di altri metodi e proprietà. Nell'esempio il metodo set() imposta un header HTTP mentre il metodo send() invia il contenuto della risposta al client e chiude la transazione HTTP.

Come si può notare, l'approccio più comunemente usato in Node.js per gestire il protocollo HTTP è quello di far affidamento su di un framework per semplificare il codice necessario a svolgere tale compito.