如何防止意外数据导致nodejs服务器致命崩溃?

时间:2015-02-01 10:11:09

标签: javascript node.js socket.io-1.0

尽管我在nginx,apache,jboss等服务器方面拥有丰富的经验,但我对nodejs服务器非常陌生(我对socket.io功能感兴趣)。我发现很奇怪,像object.MyProperty(未定义)等意外数据 - 在我看来这是微不足道的,导致整个服务器崩溃(它不会崩溃该客户端请求,但整个服务器崩溃!)和你需要重启服务器。

我不确定是不是因为我处于开发模式,或者它也会像现场模式那样。当它崩溃时,所有运行时数据都会丢失。 我的问题是,我该怎么做才能确保服务器没有崩溃,但它可以像在其他服务器中一样将问题写入日志文件。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

您可以使用try catch块。 log下的catch


<强>更新

此外,Node是基于单个进程的,未捕获的异常会导致崩溃(该进程)。建议的方法之一是使用domains。 例如:

domain = require('domain'),
d = domain.create();

d.on('error', function(err) {
  console.error(err);
});

d.run(function() {
   ...

Ref.是一篇很好的文章,简要解释了解决问题的各种方法。

答案 1 :(得分:1)

process.on('uncaughtException', function (err) {
  console.error((new Date).toUTCString() + ' uncaughtException:', err.message)
  console.error(err.stack)
})

由于nodejs是单个进程服务器,因此您可以将此代码放在js脚本中的任何位置,以便充当未处理/意外错误的全部捕获。

答案 2 :(得分:0)

我认为您正在寻找https://github.com/foreverjs/forever。 Forever永远运行脚本,并在发生崩溃时重新启动它,无需用户干预。

您可以使用npm永久安装。安装后,您可以使用forever start <path/to/script>运行nodejs脚本。 forever list将列出所有当前正在运行的脚本,forever stop <script-id>将停止给定的脚本。

请记住,使用此并不意味着您不必进行适当的异常处理。根据需要实现try...catch语句并处理代码中的所有异常。

答案 3 :(得分:0)

执行此操作的最佳方法是使用json架构验证程序验证所有传入的邮件请求正文。有几种可用的非常快,并且会为您的总体响应时间增加非常小的开销(小于1 ms)。我是一个名为Themis的验证器的作者,我们将其用于REST API。还有一个全面的benchmark,它比较了所有可用的JSON模式验证器。

这样可以防止您的服务器因为请求错误而崩溃并变得不可用。