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

我可以不杀死应用程序,而是将其输出到某个文件中,并尝试从停止的地方恢复应用程序 - 或者安静地重新启动并向应用程序上的所有用户显示一条好消息,表明某些内容已关闭出了问题,等它自行解决。

如果应用程序未运行,如果可以将其重定向到显示“应用程序未运行,请联系我”或类似内容的某个位置,那就太好了。

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

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

请您参考如下方法:

在崩溃后,您实际上无法恢复,至少在没有专门为此目的编写的代码(例如定义状态和所有内容)的情况下是如此。

否则使用 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 
}); 
<小时 />

When it forks, how does it affect the users - do they experience any latency while it's switching?

集群通常用于始终运行 Node 应用程序的多个副本,以便当其中一个工作程序重新生成时,其他工作程序仍然处于事件状态并防止任何延迟。

if (cluster.isMaster) 
    require('os').cpus().forEach(cluster.fork); 
 
cluster.on('exit', cluster.fork); 
<小时 />

Is there anything that I should look out for, e.g. say there was an error connecting to the database and I hadn't put in a handler to deal with that, so the app kept on crashing - would it just keep trying to fork and hog all the system resources?

其实我之前并没有考虑过这个问题。听起来这是一个很好的担忧。

通常这些错误是用户引起的,因此预计不会导致此类问题。

也许数据库未连接问题,以及其他此类不可恢复错误应该在代码实际进入创建 fork 之前处理。

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

或者也许应该识别此类错误并且不应创建 fork 。但您可能必须提前知道可能是哪些错误,以便可以处理它们。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!