Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理节点,表示背景错误_Javascript_Node.js_Express_Error Handling - Fatal编程技术网

Javascript 处理节点,表示背景错误

Javascript 处理节点,表示背景错误,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

我很不确定如何正确处理node.js/express应用程序中出现的未捕获异常。现在我有一个Express应用程序,它将使用next(err),将所有捕获的错误发送给Express error Handler

对于我预期的
错误
,这似乎工作得很好。例如,数据库连接不起作用,基本上所有返回
回调(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')
}