Node.js: due aspetti fondamentali da considerare

Node.js: due aspetti fondamentali da considerare

In Node.js ci sono due aspetti fondamentali da tenere sempre in considerazione.

Stiamo programmando un web server

Avrete notato che quando create una nuova directory e vi inserite dei file al suo interno questi sono immediatamente accessibili via web con lo stack LAMP o LEMP. Questo accade perché Apache e nginx li gestiscono automaticamente per voi.

Questo non accade in Node.js. Siamo noi che dobbiamo istruire Node su come gestire quella directory e quei file (ad esempio con express.static() in ExpressJS). Se non lo facciamo, quella directory e quei file non saranno mai accessibili.

Dobbiamo comprendere che con Node.js stiamo di fatto programmando un web server da zero. Node fornisce solo i moduli di base per la gestione del networking e per le altre attività. È compito nostro utilizzare quei moduli (direttamente o tramite un package specifico NPM) per gestire il nostro sito o la nostra app.

Pensiamo ad esempio all'upload dei file: Apache ed nginx si limitano a passare il file caricato temporaneamente tramite HTTP a PHP che lo gestisce con l'array supeglobale $_FILES a partire dalla copia memorizzata nella directory dei file temporanei.

In questo caso il livello server (Apache ed nginx) è separato da quello applicativo (PHP) e consiste di due step distinti. In Node questa separazione non esiste ed è per questo motivo che di solito usiamo package come formidable o multer per gestire entrambi i passaggi in un'unica soluzione.

Livello applicativo e livello server

Avrete sicuramente implementato o implementerete un carrello di un e-commerce con le sessioni di PHP. Noterete anche in locale che cambiando browser il vostro carrello ripartirà sempre con zero prodotti ad ogni prima connessione.

Questo accade perché le sessioni di PHP funzionano a livello applicativo: session_start() inizializza la sessione inviando un cookie (ad esempio PHPSESSID) specifico al browser. Quindi se con il browser A aggiungete un prodotto al carrello e poi vi collegate con il browser B, noterete che il carrello nel browser B è vuoto.

In Node.js, al contrario, potreste avere la spiacevole sorpresa di avere il carrello con lo stesso prodotto in entrambi i browser. Il punto è che con Node non c'è separazione tra livello applicativo e livello server: se usate request.session con il package express-session per ExpressJS, ogni volta che aggiungete una variabile quella variabile persisterà per l'intero ciclo vitale dell'applicazione (ossia fino a quando l'esecuzione di node app.js non verrà terminata).

Quindi se il carrello non viene creato (e in seguito distrutto con l'operatore delete) in seguito ad un'azione specifica (ad esempio in una route) ma all'inizio, avrete lo stesso carrello condiviso per tutti i client che si connetteranno al sito.

In altre parole in Node occorre sempre chiedersi se il codice che scriveremo interesserà il livello applicativo o il livello server e agire di conseguenza.

Torna su