【问题标题】:Whole app in MEAN stack crashes for a single bugMEAN 堆栈中的整个应用程序因单个错误而崩溃
【发布时间】:2015-10-29 18:02:28
【问题描述】:

我正在使用 MEAN 堆栈开发 Web 应用程序。当代码中出现错误时,整个应用程序崩溃,我必须重新启动服务器(重新运行应用程序)。

这种行为在开发过程中可能不是问题。但是当应用程序投入生产时,如果出现一些意想不到的错误,整个应用程序就会崩溃。我必须时刻关注系统并在发生错误时重新启动它?我在这里错过了什么?

【问题讨论】:

  • 您需要更好地处理错误,也许使用 try catch。此外,对您编写的错误和代码的描述也会有所帮助。
  • 另外,在某些情况下还有一个可以处理的'error' 事件。例如,这里的代码示例:nodejs.org/api/http.html#http_http_get_options_callback
  • 这意味着如果抛出一个未处理的错误,那么服务器在 MEAN 堆栈中出现故障?实际上,即使你正确处理错误,有时也会在大型应用程序中抛出一些错误!
  • 扪心自问:当你的应用遇到unexpected错误时应该怎么做?根据定义,这是开发人员没有预料到的,因此应用程序最终处于未定义状态的可能性很大。除了崩溃,它应该做什么else? FWIW,请查看 pm2 以获取会密切关注的流程管理器。
  • 好吧,在 Java EE 世界中,如果抛出错误,该特定部分将无法运行。但其他部分将正常运行。服务器永远不会因为应用程序错误而宕机。

标签: node.js express mean-stack


【解决方案1】:

这是我在生产中看到的一种解决方案,用于确保节点程序始终运行(即使在服务器重新启动后)。

永远使用 (https://www.npmjs.com/package/forever)。您可以通过代码或命令行运行它。

 $ [sudo] npm install forever -g
 forever start app.js

app.js 有用于实例化 Web 服务器的代码(在 MEAN 堆栈中,它是快速初始化)。

【讨论】:

  • 请添加拒绝投票的理由。
  • 我不明白为什么人们不赞成这个答案!!
【解决方案2】:

如果未处理的错误冒泡到堆栈顶部而没有被捕获,则崩溃是预期的行为。未处理的异常意味着您的应用处于未定义状态。

这样想。如果您失去对汽车的控制并驶离公路,最好的办法是猛踩刹车并停止(也称为受控程序 crashhalt),而不是而不是继续盲目地在树叶、花坛、后院、游泳池、蹒跚学步的孩子以及任何其他可能会遇到的障碍物中乱跑。

我建议使用forever 之类的工具在生产环境中运行您的应用,该工具会在应用崩溃时监控并重新启动您的应用。这种事情是标准做法。显然你不希望它崩溃,你应该在你知道如何从错误中恢复的上下文中处理错误。有些框架在不崩溃的情况下平稳地处理错误方面比其他框架做得更好。重新启动该过程主要是最适合让您完全措手不及的事情。查看更多错误处理提示:

https://www.joyent.com/developers/node/design/errors

【讨论】:

  • 扩展类比:只是永远使用而不确保您首先正确处理错误,就像知道您的制动电缆被切断并且每次回到车里并再次驾驶它一样崩溃。
  • 我有点同意/不同意。从这个意义上说,“碰撞”更像是受控停止,所以从这个意义上说,你的紧急制动电缆永远不会被切断,无论你的错误处理多么糟糕。紧急停止/崩溃总是比继续处于未定义状态要好。良好的错误处理只会从那里改善情况。
【解决方案3】:

您提到的问题是您在开发应用程序时需要牢记的一点。因为处理错误的方式是你不能跳过的。您可以使用一些有用的解决方案(只是整个“错误处理”世界的一小部分)来保存您的应用程序。

但是让我们从您的问题开始。由于您已经遇到这种情况,我可以建议您将节点域模块集成到您的应用程序中,这样在出现此类异常时它不会崩溃。请参考以下链接:

https://nodejs.org/api/domain.html

您可以包装您的服务器创建并捕获所有未处理的异常。

例子:

var domain = require('domain').create();

domain.on('error', function(err){
  //track error into your log file
  //do something else with error (send message to admin, send error response etc. )
});

domain.run(function(){
  //run http server here
});

您也可以在这里找到很好的例子:

https://engineering.gosquared.com/error-handling-using-domains-node-js

至于错误处理解决方案,我建议您遵守以下规则:

  • 使用域捕获异常
  • 使用节点事件发射器来事件和捕获异常
  • 在处理函数结果时始终考虑可能的情况
  • 开发单一的错误处理策略(抛出错误/返回错误/向用户发送错误等)
  • 使用 try catch 块来保护代码块免受未处理异常的影响

您可以找到更多解决方案。

请查看我建议您查看的链接:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多