Вы можете обратиться к примеру ниже для некоторых деталей.
Здесь для конечной точки GET '/' промежуточное программное обеспечение явно выдает ошибку 'error error'.
В этот момент запускается механизм экспресс-обработки ошибок, который ищет обработчик ошибок (с ошибкой в качестве параметра). В результате последующее «Hello» не отправляется обратно клиенту, поскольку его обработчик не является ошибочным.
Последующие обработчики ошибок logErrors, clientErrorHandler и errorHandler вызываются одна за другой для выполнения соответствующих задач, при этом последний из них записывает ответ.
Причина, по которой они помещаются в конце, заключается в том, чтобы отлавливать ошибки, выдаваемые объявленным промежуточным программным обеспечением, и элегантно обрабатывать их, то есть печатать, регистрировать, отправлять почту и т. Д. Думать об этом с точки зрения механизма try catch в других языках, таких как Java , Если заявлено выше других промежуточных программ, они будут бесполезны, так как ошибки не будут обработаны. Вы можете увидеть разницу в выводе, изменив порядок запроса 'GET' на обработчики ошибок.
const express = require('express');
const app = express();
app.get('/', (req, res, next) => next(new Error('problem error')), (req, res) => {
res.status(200).send("Hello");
});
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);
function logErrors (err, req, res, next) {
console.error(err.stack)
next(err)
}
function clientErrorHandler (err, req, res, next) {
if (req.xhr) {
res.status(500).send({ error: 'Something failed!' })
} else {
next(err)
}
}
function errorHandler (err, req, res, next) {
if (res.headersSent) {
return next(err)
}
res.status(500)
res.render('error', { error: err })
}
app.listen(3000, () => console.log('Example app listening on port 3000!'))