Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.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 如何防止意外数据导致nodejs服务器致命崩溃?_Javascript_Node.js_Socket.io 1.0 - Fatal编程技术网

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

Javascript 如何防止意外数据导致nodejs服务器致命崩溃?,javascript,node.js,socket.io-1.0,Javascript,Node.js,Socket.io 1.0,尽管我对nginx、apache、jboss等服务器有着丰富的经验,但我对nodejs服务器还是很陌生(我对socket.io特性很感兴趣)。我觉得奇怪的是,意外的数据,比如说object.MyProperty(未定义)等——在我看来,这些数据微不足道——会导致整个服务器崩溃(该客户端请求不会崩溃,但整个服务器都崩溃!),您需要重新启动服务器 我不确定这是因为我在开发模式上,还是在直播模式下也会如此。当它崩溃时,所有运行时数据都会丢失。 我的问题是,我应该做什么来确保服务器不会崩溃,但它可以像在

尽管我对nginx、apache、jboss等服务器有着丰富的经验,但我对nodejs服务器还是很陌生(我对socket.io特性很感兴趣)。我觉得奇怪的是,意外的数据,比如说object.MyProperty(未定义)等——在我看来,这些数据微不足道——会导致整个服务器崩溃(该客户端请求不会崩溃,但整个服务器都崩溃!),您需要重新启动服务器

我不确定这是因为我在开发模式上,还是在直播模式下也会如此。当它崩溃时,所有运行时数据都会丢失。 我的问题是,我应该做什么来确保服务器不会崩溃,但它可以像在其他服务器中一样将问题写入日志文件


非常感谢您的帮助

您可以为此使用
try
catch
块。并将它们记录在
catch


更新:

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


这是一篇很好的文章,简要介绍了处理该问题的各种方法。

我想您正在寻找。Forever永远运行脚本,并在发生崩溃时重新启动脚本,无需用户干预

您可以使用npm永久安装。安装后,您可以使用
永久启动
运行nodejs脚本<代码>永久列表将列出当前运行的所有脚本,
永久停止
将停止给定脚本

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

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

由于nodejs是一个单一的进程服务器,因此您可以将此代码放在js脚本中的任何位置,以作为未处理/未预见错误的总括。

最好的方法是使用json模式验证器验证所有传入的post请求主体。有几种可用的响应速度非常快,将为您的总体响应时间增加非常小的开销(小于1毫秒)。我是一个这样的验证器的作者,这个验证器被称为RESTAPI。还有一个比较所有可用的JSON模式验证器的综合测试


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

谢谢您的回复,但您无法真正预测实际应用程序在生产模式下可能出现的一些意外问题。例如,假设我正在使用来自第三方模块的函数。可能存在我们无法提前预测的情况,但这些第三方函数可能不喜欢参数长度等。有时将try{}catch{}放在任何地方都是不合理的。由于一个问题,所有客户端连接都断开。如果特定的请求由于异常数据而失败,这是可以的,但它不应该使整个服务器崩溃。这难道不会使服务器非常脆弱吗?@Konul更新答案(简而言之,您可以尝试
-查找文档),谢谢您的快速回复。实际上我一直在努力。但它只是在服务器崩溃后重新启动服务器。其他客户端的运行时数据仍然丢失。例如,假设网站A使用nodejs服务器。你和我访问这个网站。我输入了一些非常奇怪的信息,不知怎的(我们不必详细说明),我的请求失败了,出现了错误。您的请求也会失败。有些数据,如文件指针、套接字指针等,不能真正存储和重用。所以,在聊天应用程序中,每个人的实例都会崩溃并丢失所有数据。理想情况下,不应该有任何崩溃。永远只是一个备份,以防所有的地狱突然爆发。正如@nash_ag所建议的,
可用于处理意外和未捕获的异常。所以我想两者的结合是理想的?
process.on('uncaughtException', function (err) {
  console.error((new Date).toUTCString() + ' uncaughtException:', err.message)
  console.error(err.stack)
})