错误处理程序如何工作?

时间:2018-05-08 02:12:52

标签: express

如何触发error handler

在示例代码中,我发现它位于所有中间件函数的底部。这个职位很重要吗?

1 个答案:

答案 0 :(得分:0)

您可以参考下面的示例了解一些细节。 在这里,对于'/'GET端点,中间件显式抛出错误'问题错误'。 此时,将触发express错误处理程序机制,它会查找错误处理程序(将err作为参数)。因此,后续的“Hello”不会被发送回客户端,因为它的处理程序不是错误的。

后续错误处理程序logErrors,clientErrorHandler和errorHandler逐个调用以执行相关任务,最后一个写回响应。

它们放在最后的原因是捕获声明的中间件抛出的错误并优雅地处理它们,即打印它,记录它,发送邮件等。用Java等其他语言中的try catch机制来思考它。如果在其他中间件之上声明,它们将变得无用,因为不会处理错误。您可以通过将错误处理程序交换'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!'))