Express 4 / Node JS - 优雅地管理uncaughtException

时间:2015-02-07 15:18:30

标签: node.js express error-handling uncaught-exception

我尽力确保我的代码中没有错误,但偶尔会出现未捕获的异常并导致我的应用程序崩溃。

我可以用它来杀死应用程序,而是将其输出到某个地方的文件,然后尝试恢复它停止的应用程序 - 或者静静地重启并向应用程序上的所有用户显示一条消息出错了,并在它自行排除时给它一秒钟。

如果应用程序没有运行,如果它可以将其重定向到某个“#34;应用程序未运行的地方”,那么它就会很好,请联系让我知道&#34 ;或类似的东西。

我可以使用process.on(' uncaughtException')... - 但这是正确的做法吗?

非常感谢您花时间阅读本文,感谢您对此事的帮助和想法。

1 个答案:

答案 0 :(得分:1)

崩溃后你实际上无法恢复,至少没有专门为此目的编写的代码,比如定义状态和一切。

否则使用clusters重新启动应用。

// ... your code ...

var cluster = require('cluster');
process.on('uncaughtException', function(err){
    //.. do with `err` as you please
    cluster.fork(); // start another instance of the app
});

  

当它分叉时,它如何影响用户 - 他们在切换时会遇到任何延迟吗?

群集通常用于始终运行多个节点应用程序的副本,以便在其中一个工作人员重新生成时,其他人仍处于活动状态并防止任何延迟。

if (cluster.isMaster)
    require('os').cpus().forEach(cluster.fork);

cluster.on('exit', cluster.fork);

  

我应该注意什么,例如说连接到数据库时出错并且我没有处理这个问题,因此应用程序一直处于崩溃状态 - 它会不会继续尝试分叉并占用所有系统资源?

我之前没想过这个问题。听起来很关心。

通常错误是用户发起的,所以预计不会导致这样的问题。

也许数据库没有连接问题,并且在代码实际用于创建分支之前,应该处理其他不可恢复的错误。

mongoose.connection.on('open', function() {
    // create forks here
});
mongoose.connection.on('error', function() {
    // don't start the app if database isn't working..
});

或许应该识别出这样的错误,不应该创建叉子。但你可能必须事先知道那些错误,所以你可以处理它们。