当前位置: 首页 > 面试题库 >

如何防止node.js崩溃?尝试捕获不起作用

锺玺
2023-03-14
问题内容

根据我的经验,php服务器会向日志或服务器端抛出异常,但是node.js只会崩溃。因为尝试都是异步完成的,所以用try-
catch包围我的代码也不起作用。我想知道其他人在生产服务器中做什么。


问题答案:

您可以从Node自己的文档中(http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception)阅读其他答案,真是太疯狂了

如果有人在使用其他规定的答案,请阅读Node Docs:

请注意,这uncaughtException是异常处理的非常粗糙的机制,以后可能会删除

下午2

首先,我会强烈建议安装PM2Node.js。PM2非常适合处理崩溃和监视Node应用程序以及负载平衡。每当PM2崩溃时,PM2都会立即启动Node应用程序,无论出于任何原因甚至在服务器重新启动时都会停止。因此,即使有一天即使在管理完我们的代码之后,应用程序崩溃,PM2仍可以立即重新启动它。有关更多信息,请安装并运行PM2

现在回到我们的解决方案,以防止应用程序本身崩溃。

因此,经过研究之后,我终于想到了Node文档本身的建议:

不要使用uncaughtException,而是使用domainswith
cluster。如果您使用uncaughtException,请在每个未处理的异常后重新启动应用程序!

*含 *丛集的 DOMAIN* *

我们实际上要做的是向触发错误的请求发送错误响应,同时让其他请求在正常时间内完成,并停止侦听该工作线程中的新请求。

这样,域使用与群集模块紧密结合,因为当工作进程遇到错误时,主进程可以派生新的工作进程。请参阅下面的代码以了解我的意思

通过使用Domain,以及使用Cluster可以将程序分为多个工作进程的弹性,我们可以做出更适当的反应,并以更高的安全性处理错误。

var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;

if(cluster.isMaster) 
{
   cluster.fork();
   cluster.fork();

   cluster.on('disconnect', function(worker) 
   {
       console.error('disconnect!');
       cluster.fork();
   });
} 
else 
{
    var domain = require('domain');
    var server = require('http').createServer(function(req, res) 
    {
        var d = domain.create();
        d.on('error', function(er) 
        {
            //something unexpected occurred
            console.error('error', er.stack);
            try 
            {
               //make sure we close down within 30 seconds
               var killtimer = setTimeout(function() 
               {
                   process.exit(1);
               }, 30000);
               // But don't keep the process open just for that!
               killtimer.unref();
               //stop taking new requests.
               server.close();
               //Let the master know we're dead.  This will trigger a
               //'disconnect' in the cluster master, and then it will fork
               //a new worker.
               cluster.worker.disconnect();

               //send an error to the request that triggered the problem
               res.statusCode = 500;
               res.setHeader('content-type', 'text/plain');
               res.end('Oops, there was a problem!\n');
           } 
           catch (er2) 
           {
              //oh well, not much we can do at this point.
              console.error('Error sending 500!', er2.stack);
           }
       });
    //Because req and res were created before this domain existed,
    //we need to explicitly add them.
    d.add(req);
    d.add(res);
    //Now run the handler function in the domain.
    d.run(function() 
    {
        //You'd put your fancy application logic here.
        handleRequest(req, res);
    });
  });
  server.listen(PORT);
}

尽管Domain正在等待弃用,但随着新的替换如Node文档中所述,将被删除

该模块即将弃用。替代API最终确定后,该模块将被完全弃用。绝对必须具有域提供的功能的用户暂时可能会依赖它,但是应该期望将来必须迁移到其他解决方案。

但是直到没有引入新的替代方案之前,“带群集的域”是Node Documentation建议的唯一好的解决方案。

供深入了解DomainCluster阅读

~~https://nodejs.org/api/domain.html#domain_domain~~
Stability: 0 - Deprecated

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

感谢@Stanley Luo向我们分享了有关集群和域的精彩深入解释

集群与域



 类似资料:
  • 在 中,尝试捕获最终阻止的工作原理是什么? 所以如果有例外,我知道它会跳到捕获块,然后跳到最后的块。 但是如果没有错误,catch块不会运行,但是finally块会运行吗?

  • 我有一个PowerShell脚本,它从文件中获取文件名列表,在文件夹中搜索文件名,将其存档,然后执行其他操作。 try-catch没有像预期的那样工作。文件列表中有一个文件名不在$some_path中。我期望try-catch停止执行并执行写主机。相反,它不运行写主机,而是继续执行< code > $ data = Get-Content $ current _ file 步骤,这将抛出一个终止错

  • 我有一个discord bot,我正在处理一个命令,该命令从mysql数据库中显示关于一个字符的信息(通过提供字符名)。它工作得很好,但如果我提供了一个数据库中不存在的名称,如,则bot会崩溃。所以我的问题是。希望你能理解我的意思。 代码如下: 如果你需要我提供你更多的信息,让我知道。 感谢任何帮助!

  • 我已经写了一个节点。使用express框架的jsapi。我正在使用wait和async。我在try-catch块中捕获异步函数。但是,在catch(err)方法中,不会返回err。 在上面的例子中,我故意调用一个不存在的函数,这样它就会抛出一个错误。 我得到的答复如下。它正在命中catch块,但没有将错误添加到数据对象中。 但是,如果我将下面的行移出try catch块。控制台将抛出以下错误。 所