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

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 服务器崩溃。但是,如果路由没有停止,我该如何向客户端发送错误页面?

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

示例:在下面的简化示例中,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);

});

我认为您可能遗漏的是 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);
    }
}

或 return 在 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');
}