Javascript 处理节点,表示背景错误
我很不确定如何正确处理node.js/express应用程序中出现的未捕获异常。现在我有一个Express应用程序,它将使用next(err),将所有捕获的错误发送给Express error HandlerJavascript 处理节点,表示背景错误,javascript,node.js,express,error-handling,Javascript,Node.js,Express,Error Handling,我很不确定如何正确处理node.js/express应用程序中出现的未捕获异常。现在我有一个Express应用程序,它将使用next(err),将所有捕获的错误发送给Express error Handler: 对于我预期的错误,这似乎工作得很好。例如,数据库连接不起作用,基本上所有返回回调(err)的东西。当我想要执行一个后台任务时,会出现思维问题,该任务将在发送响应后完成。例如: app.get('/url', function(req, res) { BackgroundTask.r
:
对于我预期的错误
,这似乎工作得很好。例如,数据库连接不起作用,基本上所有返回回调(err)
的东西。当我想要执行一个后台任务时,会出现思维问题,该任务将在发送响应后完成。例如:
app.get('/url', function(req, res) {
BackgroundTask.run() // Here an uncaught exception occurs, for instance a bug
res.send('Running your background task')
}
我想要运行的后台模块与express无关(不使用req、res),一旦发现错误,它们将使用自定义的in-ErrorHandler将错误发送给某个错误报告服务。但是,当这些后台任务中的一个出现未捕获异常时,我不知道如何将错误发送到我的错误报告服务(本例中为Raygun)。唯一有效的方法是添加一个process.on('uncaughtException')
事件侦听器。然而,几乎每一篇关于这一主题的帖子都将后者描述为一种“糟糕”或粗鲁的做事方式。他们似乎建议使用node域
,但我真的不知道如何在后台任务中实现这些功能。我使用进程.on(uncaughtException)
,因为您真正要做的是捕获错误的输出,并优雅地关闭服务器(然后重新启动)。我看不出有任何理由做比这更复杂的事情,因为根据异常的性质,除了关闭之外,您不希望应用程序在该状态下做任何其他事情
域是处理这一问题的另一种方法,但它并不一定比使用流程处理程序更好,因为您正在有效地编写自定义逻辑来处理预期之外的事情。就错误处理程序对不同错误类型所做的操作而言,它确实为您提供了更精细的粒度,但最终您仍可能在处理后以未知状态运行应用程序。我宁愿让我的应用程序记录异常,关闭,然后修复错误,使其不再发生,而不是让我的用户的数据在域解决方案上冒险,域解决方案可能正确处理了错误,也可能没有正确处理错误,这取决于它遇到的错误的细微差别。为什么不尝试并找出您尚未捕获的错误,并为这些添加正确的错误处理?另外,到底是什么阻止您从uncaughtException
处理程序向外部服务发送错误报告呢?这是我自己的问题,我的问题非常广泛。该信息已过期,并且是重复的。FWIW,域可能已过期。
app.get('/url', function(req, res) {
BackgroundTask.run() // Here an uncaught exception occurs, for instance a bug
res.send('Running your background task')
}