ExpressJS possiede un middleware specifico per la gestione degli errori.

Questo middleware viene inserito dopo gli altri ed ha la particolarità di accettare come primo parametro un'istanza dell'oggetto Error.

app.use((error, req, res, next) => {

});

Per innescare la gestione dell'errore all'interno di questo middleware, dobbiamo passare un oggetto Error alla funzione next() di una route quando si verifica un problema.

app.post('/contact, async (req, res, next) => {
    try {
      const sent = await sendEmail(req.body);
      res.redirect('/thank-you');
    } catch(err) {
       const error = new Error(err);
         return next(error);
    }  
});

È importante notare che la funzione che solleva l'errore deve necessariamente interrompere la sua esecuzione tramite l'istruzione return quando si invoca la funzione next() passandole l'oggetto Error.

Nel middleware possiamo impostare lo status HTTP con un codice di errore e mostrare una pagina di errore. Finora però il nostro middleware non ha modo di sapere che tipo di errore è stato sollevato, quindi dobbiamo modificare l'istanza dell'errore aggiungendo altre informazioni.

app.post('/contact, async (req, res, next) => {
    try {
      const sent = await sendEmail(req.body);
      res.redirect('/thank-you');
    } catch(err) {
       const error = new Error(err);
       error.httpStatus = 500;
       error.displayMessage = 'Error while sending the request.';
         return next(error);
    }  
});

Ora il nostro middleware può usare queste informazioni per impostare lo status HTTP e mostrare la pagina di errore.

app.use((error, req, res, next) => {
    const { httpStatus, displayMessage } = error;
        res.status(httpStatus).render('errors/' + httpStatus, {
            title: 'Error ' + httpStatus,
            message: displayMessage
        });
});

Si noti come la generazione della pagina di errore sia completamente dinamica per quanto riguarda il template delle view da usare e il messaggio da mostrare.