【问题标题】:How to get node to exit when mongo connect failsmongo连接失败时如何让节点退出
【发布时间】:2018-05-09 04:01:56
【问题描述】:

如果我的 Node JS 应用程序无法连接到 Mongo,我希望它立即退出。我正在使用mongodb 节点库。

我已将代码缩减为

const {MongoClient} = require('mongodb');
MongoClient.connect('mongodb://localhost:27017');

如果 Mongo 没有运行,我会得到一个 UnhandledPromiseRejectionWarningECONNREFUSED,这是我完全预料到的,但随后程序挂起并且永远不会退出。这是 Node 版本 10.0.0。

由于连接从未成功,我没有要关闭的连接句柄。我尝试了各种方法来catch 被拒绝的承诺,但我未能成功让程序退出。

在这种情况下我需要做什么来关闭 MongoClient 并使程序退出?

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您的应用程序仍在运行,因为它正在尝试reconnect。您可以尝试禁用recconect:

    MongoClient.connect('mongodb://localhost:27017', {
      autoReconnect: false
    }, (err, client) => {
      if (client) client.close();
    });
    

    或者,您可以使用process.exit(1) 终止进程以终止程序。

    const {
      MongoClient
    } = require('mongodb');
    
    // Callback syntax
    MongoClient.connect('mongodb://localhost:27017', (err, db) => {
      if (err) process.exit(1);
    });
    
    // Promise syntax
    MongoClient
      .connect('mongodb://localhost:27017')
      .catch(err => {
        process.exit(1);
      });
    
    // Async/await syntax
    (async function() {
      let db;
      try {
        db = await MongoClient.connect('mongodb://localhost:27017');
      } catch (err) {
        process.exit(1);
      }
    }());
    

    【讨论】:

    • process.exit() 当然会退出程序。但值得注意的是,问题上下文中的“不关闭”实际上与驱动程序本身无关,并且会因为其他事情(可能是 http 侦听器)在事件循环中仍然处于活动状态。在“连接被拒绝”错误中,所有上述代码实际上会自行退出,“没有”显式调用process.exit(),因为“自行”在诸如此类的致命错误条件下,驱动程序不会在事件循环中保留任何内容。
    • @NeilLunn 我刚刚添加了关于重新连接的注释。这是否解决了您的担忧,还是我应该更明确一些?
    • 我实际上根本不是在谈论重新连接,但值得像你一样添加答案,因为你应该实际这样做。我相信问题的上下文是“在程序开始时”,而不是“在程序运行时”。这就是我在条件下实际谈论的“程序开始时”。 “驱动程序”实际上并不负责阻止节点退出,因为“其他”例程实际上仍然在事件循环中注册了东西,而不是驱动程序。并不是说调用process.exit() 是“不正确的”,只是“误导”“司机”需要这个。
    • 谢谢,autoReconnect 做到了。是的,我的意思是在程序开始时说。
    • 我很好奇为什么它应该尝试以这种方式重新连接,因为如果在最初失败后的某个时间,它确实管理过,那么你将如何获得连接对我来说并不明显连接。
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多