28

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

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

在 PHP 中,
如果用户向服务器和 MySQL 发送了一些无效数据,MySQL 将向该特定用户输出错误,并且整个应用程序不会关闭。

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

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

4

2 回答 2

50

您可以在流程对象上使用uncaughtException事件来做您想做的事,但就像其他人所说的那样,建议在正确级别上捕获/处理错误。

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});
于 2013-11-11T17:05:55.690 回答
4

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

我个人不认为使用 process.on('uncaughtException') 捕获验证错误是满足您需求的最佳选择,主要有两个原因:

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

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

于 2016-05-31T13:28:36.983 回答