首页 > 解决方案 > 当发生错误时,try catch 会阻止 Express 服务器崩溃。但是,如果路线没有停止,我该如何向客户端发送错误页面?

问题描述

问题:当发生错误时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.jsexpresserror-handling

解决方案


我认为您可能缺少的是该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');
}

推荐阅读