我尽力确保我的代码中没有错误,但偶尔会出现未捕获的异常并杀死我的应用程序。
我可以不杀死应用程序,而是将其输出到某个文件中,并尝试从停止的地方恢复应用程序 - 或者安静地重新启动并向应用程序上的所有用户显示一条好消息,表明某些内容已关闭出了问题,等它自行解决。
如果应用程序未运行,如果可以将其重定向到显示“应用程序未运行,请联系我”或类似内容的某个位置,那就太好了。
我可以使用 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 。但您可能必须提前知道可能是哪些错误,以便可以处理它们。