In ExpressJS possiamo gestire le sessioni in modo molto semplice.

A differenza di quanto avviene in PHP, in ExpressJS una sessione viene creata per tutte le route della nostra applicazione. Nello specifico, una sessione è un oggetto aggiunto tramite middleware all'oggetto richiesta request.

Il modulo express-session opera appunto in questo modo. Una volta creato l'oggetto sessione, possiamo aggiungere e rimuovere le variabili di sessione come proprietà di tale oggetto.

Il funzionamento è analogo all'uso dell'array superglobale $_SESSION in PHP, con l'unica importante differenza che in ExpressJS operiamo con un oggetto JavaScript.

Anche se questo modulo per impostazione predefinita conserva i valori unicamente in memoria, tuttavia in produzione è consigliabile appoggiarci ad un database perché spesso è utile poter recuperare i dati di una sessione per un futuro riutilizzo (si pensi al salvataggio del carrello di un e-commerce e al suo recupero per la finalizzazione di un acquisto in sospeso).

Il modulo che useremo supporta tra i vari storage anche il database MongoDB. Quindi come prima cosa dobbiamo installare i due moduli richiesti.

npm install express-session --save
npm install connect-mongodb-session --save

Nel nostro database dovremo creare una collezione per le sessioni, che per comodità chiameremo sessions. Quindi includiamo i moduli nella nostra app.

'use strict';

const express = require('express');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);

La configurazione dello storage MongoDB è molto semplice: i parametri richiesti sono l'URL della connessione al database e il nome della collezione da usare.

const store = new MongoDBStore({
    uri: 'mongodb://username:password@127.0.0.1/test',
    collection: 'sessions'
});

A questo punto dobbiamo inizializzare la sessione come middleware delle route.

const app = express();
app.use(session({
    secret: 'token segreto',
    resave: false,
    saveUninitialized: true,
    unset: 'destroy',
    store: store,
    name: 'nome cookie sessione,
    genid: (req) => {
        // Restituire un ID identificativo casuale per la sessione
    }
}));

Ora occorre fare attenzione: poiché la sessione viene creata a livello applicativo, le variabili di sessione devono essere create e modificate tenendo presente che, a differenza di PHP, stiamo operando a livello globale. Ad esempio un carrello di un e-commerce non può essere creato nella fase di inizializzazione dell'app, perché così facendo non avremo un carrello per utente ma un unico carrello per tutti gli utenti. Di conseguenza il nostro carrello dovrà essere creato e modificato a seguito di specifiche azioni da parte dell'utente.

Guardiamo ad esempio come avverrebbe un ipotetico login.

app.post('/login', async (req, res) => {
    try {
        let user = await db.users.findOne({email: req.body.email});
        if(user !== null) {
            req.session.user = {
                  email: user.email,
                  name: user.name
            };
            res.redirect('/account');
        } else {
           // Login non valido
        }
    } catch(err) {
        res.sendStatus(500);
    }
});

Se il login ha avuto successo, viene creato un oggetto user nella sessione corrente che contiene l'e-mail ed il nome dell'utente come sue proprietà. Questo oggetto può essere usato da tutte le route.

app.get('/account', (req, res) => {
    if(!req.session.user) {
        res.redirect('/login');
    } else {
        res.render('account', {user: req.session.user});
    }
});

In questo caso se l'utente non ha effettuato il login, l'oggetto user non è presente nella sessione. Viceversa, possiamo anche passare tale oggetto alle view della nostra app.

Per eliminare una variabile di sessione possiamo utilizzare l'operatore delete.

app.get('/logout', (req, res) => {
    if(req.session.user) {
        delete req.session.user;
        res.redirect('/login');
    } else {
        res.redirect('/');
    }        
});

Appare chiaro a questo punto che la gestione delle variabili di sessione in ExpressJS è una semplice manipolazione di un oggetto JavaScript.