Node.js Express 4/Node JS-优雅地管理未捕获异常

Node.js Express 4/Node JS-优雅地管理未捕获异常,node.js,express,error-handling,uncaught-exception,Node.js,Express,Error Handling,Uncaught Exception,我尽最大努力确保我的代码中没有错误,但偶尔会出现一个未捕获的异常,导致我的应用程序死机 我可以这样做,不杀死应用程序,而是将其输出到某个文件中,然后尝试在应用程序停止的地方恢复应用程序-或者安静地重新启动,并向应用程序上的所有用户显示一条好消息,说明出现了问题,并在应用程序自行解决时给它一秒钟时间 如果应用程序没有运行,最好将其重定向到“应用程序没有运行,请联系我让我知道”之类的地方 我可以使用process.on('uncaughtException')…-但这是正确的做法吗 非常感谢您花时间

我尽最大努力确保我的代码中没有错误,但偶尔会出现一个未捕获的异常,导致我的应用程序死机

我可以这样做,不杀死应用程序,而是将其输出到某个文件中,然后尝试在应用程序停止的地方恢复应用程序-或者安静地重新启动,并向应用程序上的所有用户显示一条好消息,说明出现了问题,并在应用程序自行解决时给它一秒钟时间

如果应用程序没有运行,最好将其重定向到“应用程序没有运行,请联系我让我知道”之类的地方

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


非常感谢您花时间阅读本文,我也感谢您在这件事上的帮助和想法。

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

否则,请使用重新启动应用程序

// ... 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);

是否有什么我应该注意的,例如,连接到数据库时发生错误,而我没有设置处理程序来处理,因此应用程序不断崩溃-它会继续尝试占用所有系统资源吗

事实上,我以前没有考虑过这个问题。听起来是个好问题

通常错误是由用户挑起的,因此预计不会导致此类问题

可能是数据库未连接问题,以及其他类似的不可恢复的错误,应该在代码实际用于创建fork之前进行处理

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

或者,应该识别这些错误,而不应该创建分叉。但是你可能必须事先知道哪些错误可能是错误,这样你才能处理它们。

谢谢@laggingreflection-你以前使用过集群吗-如果是,当它分叉时-它对用户有什么影响-他们在切换时是否会经历任何延迟-有什么我应该注意的吗(例如,假设连接到数据库时出现错误,而我没有设置处理程序来处理,因此应用程序一直崩溃-它是否会继续尝试占用所有系统资源?)。很好@laggingreflect回答您的问题-这与我正在寻找的完全一样。:)