繁体   English   中英

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

[英]how to prevent unexpected data from causing fatal crash of nodejs server?

尽管我在nginx,apache,jboss等服务器方面拥有丰富的经验,但我对Node.js服务器还是很陌生(这引起了我对socket.io功能的兴趣)。 我觉得奇怪的是,像object.MyProperty这样的意外数据(未定义)等-我认为这很琐碎,导致整个服务器崩溃(该客户端请求没有崩溃,但是整个服务器崩溃了!),您需要重启服务器。

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

非常感谢您的协助。

您可以为此使用try catch块。 log他们在catch


更新:

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

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

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

d.run(function() {
   ...

参考。 是一篇很好的文章,并简要说明了解决该问题的各种方法。

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

由于nodejs是单个进程服务器,因此您可以将此代码放置在js脚本中的任何位置,以充当所有未处理/无法预料的错误的全部。

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

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

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

最好的方法是让您使用json模式验证器验证所有传入的发帖请求主体。 有几种可用的方法确实非常快,并且将为您的整体响应时间增加非常小的开销(少于1毫秒)。 我是一个名为Themis的验证器的作者,我们将其用于REST API。 还有一个全面的基准测试 ,用于比较所有可用的JSON模式验证器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM