node.js - 当发生错误时,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);
});
解决方案
我认为您可能缺少的是该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');
}
推荐阅读
- swift - Swift 包管理器的问题 - 模块映射应该在“包含”目录中
- java - 从其他文件导入 Java
- android - Android 状态栏裁剪菜单
- sonata-admin - 在 SonataAdminBundle 的表单中添加 Order by 选项(在 Symfony 4 中)
- javascript - 有什么方法可以防止出站链接被本机应用程序处理?
- angular - 如何将模块导入子模块?
- teamcity - Katalon Studio 与 TeamCity 集成 - 错误 - com.kms.katalon.execution.exception.InvalidConsoleArgumentException:未找到测试套件“测试”
- c# - DevExpress XAF - 在 ViewController 中执行代码之前测试对象是否已注册
- java - Java JAXB 编组到 DOM 文档中
- python - CrawlerProcess / 不带任何物品 / Scrapy