首页 > 解决方案 > 错误处理程序如何工作?

问题描述

错误处理程序是如何被触发的?

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

标签: express

解决方案


您可以参考下面的示例了解一些详细信息。在这里,对于 '/' 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!'))


推荐阅读