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.