【问题标题】:When an error occurs try catch stops an Express server from crashing. However, If the route doesn't stop how do I send the client an error page?当发生错误时,try catch 会阻止 Express 服务器崩溃。但是,如果路线没有停止,我该如何向客户端发送错误页面?
【发布时间】:2021-08-26 23:47:08
【问题描述】:

问题:当错误发生时try catch 阻止 Express 服务器崩溃。但是,如果路由没有停止,我该如何向客户端发送错误页面?

背景:也许我正在处理这个错误,但如果出现数据库错误或类似问题,客户端不应该收到错误页面吗?

示例:在下面的简化示例中,try catch 可防止服务器崩溃。但是,它也会阻止 500.html 被发送到客户端,因为事件循环总是会到达 res.render('homepage') 并发送它。

app.get('/', function(req, res, next) {

    let cat = 10;

    try {
        if (cat === 10) throw new Error('cat should not be 10');
    } catch(error) {
        next(error);
    }

    res.render('homepage');
}

// custom error handler
app.use( function(error, req, res, next) {

    console.log(error);
    let filePath = path.join(__dirname, '/error-pages/500.html');
    res.status(500).sendFile(filePath);

});

【问题讨论】:

    标签: node.js express error-handling


    【解决方案1】:

    我认为您可能缺少的是next() 函数不会阻止您的应用程序转到下一条指令res.render('homepage');。 我相信res.render('homepage'); 在您的处理程序有机会之前运行。 您可以将 res.render('homepage'); 放在 try 块中

    app.get('/', function(req, res, next) {
        let cat = 10;
    
        try {
            if (cat === 10) throw new Error('cat should not be 10');
            res.render('homepage');
        } catch(error) {
            next(error);
        }
    }
    

    或者在 catch 块内返回。这将取决于您希望从逻辑中得到什么。

    app.get('/', function(req, res, next) {
        let cat = 10;
    
        try {
            if (cat === 10) throw new Error('cat should not be 10');
        } catch(error) {
            return next(error);
        }
        res.render('homepage');
    }
    

    【讨论】:

    • return 是一个如此出色而简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多