如何处理node.js中的所有异常

Par*_*ars 16 error-handling node.js

在使用node.js工作了几周之后,我发现node.js服务器错误和常规服务器端语言(如PHP)之间存在差异.

一个简单的例子:如果出于任何原因在我们的网站上发生错误.

在PHP中
如果用户向服务器和MySQL发送一些无效数据,MySQL将向该特定用户输出错误,整个应用程序不会发生故障.

在Nodejs中
如果用户向服务器和MySQL发送一些无效数据,nodejs Server将关闭,因此所有用户将断开连接,用户之间不再有任何连接.

这是一个非常大的问题.在大型Web应用程序中,不可能处理所有错误以避免Nodejs服务器停机,问题是,
有没有办法处理任何未知的致命错误和特定输出的异常或类似的东西.

Bad*_*yon 35

您可以在流程对象上使用uncaughtException事件来执行您想要的操作,但正如其他人所说的那样,建议使用域和正确级别的捕获/处理错误.

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您使用uncaughtException事件,则_must_退出进程而不继续正常操作,因为应用程序处于不一致状态.https://nodejs.org/api/process.html#process_warning_using_uncaughtexception_correctly (11认同)
  • 示例:您是一个 HTTP 服务器。收到一个请求,您开始处理它,然后抛出一个未捕获的异常。您可以使用上面的代码处理异常,但现在请求超出了范围。客户仍在等待响应,但他们的请求已被清除......或者是吗?谁知道?这是未定义的。如果您正在更新某些内部状态怎么办?你如何从这个问题中恢复过来?你不知道。你甚至不知道异常从何而来。您能做的最好的事情就是记录异常,尽可能干净地退出,然后让程序员弄清楚发生了什么。 (2认同)

Yon*_*tan 5

您应该简单地验证路由中的请求数据,捕获任何错误(try-catch 将在此处工作,因为它是同步操作)并通过向调用者返回适当的 HTTP 状态(例如 400)并记录错误来处理它。如果您使用 Express,您甚至不必使用 try-catch,因为 Express 将捕获所有同步异常并允许您集中处理它。

我个人认为使用 process.on('uncaughtException') 捕获验证错误并不是最适合您的需求,原因有两个:

  • 在此位置,您不知道错误发生的位置,也无法向调用者发回响应
  • 任何类型的未处理的错误都会到达这里,如果您不知道发生了什么类型的错误,建议重新启动该过程。由于输入无效,重新启动进程是没有意义的,例如,这种方式很容易让任何外部调用者(DDOS)关闭应用程序

您可以在此处阅读有关其他错误处理最佳实践的信息,并具体参考第 4,6 和 10 条