问题:发生错误时,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');
放置在试块中
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);
}
}
或者返回到卡块内部。这将取决于你的逻辑想要什么。
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');
}