代码之家  ›  专栏  ›  技术社区  ›  Erik B

MongoClient无法在第一次连接时连接到服务器,但稍后连接

  •  1
  • Erik B  · 技术社区  · 8 年前

    我很困惑 MongoClient.connect 应该被使用。我有一个使用MongoDB的快速应用程序,我正在用docker部署它。使用时 docker-compose up ,应用程序可能会在mongo准备接受连接之前尝试连接到mongo。当发生这种情况时,我得到以下错误:

    MongoNetworkError: failed to connect to server [mongo:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 172.18.0.2:27017]
    

    这很好,但一旦数据库可用,它就会连接起来。那也可以,但是承诺已经被拒绝了,我根本没有办法使用这种连接。我还尝试切换到使用回调,但失败后再也不会调用回调。

    我可以一直重试,直到得到一个正常工作的连接而不出错,但是每次重试,我都会得到另一个到数据库的连接,在应用程序重新启动之前不会关闭,通常是在部署新版本时。

    我要么需要一种方法来使用最初失败的连接,要么阻止失败的连接重试。有人知道怎么做吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   JohnnyHK    8 年前

    的3.0版本Node.js节点MongoDB驱动程序为您提供了一些额外的灵活性,因为您可以创建自己的 MongoClient 对象并使用其方法进行连接,检查是否仍处于连接状态,然后根据需要断开连接:

    let mc = new mongodb.MongoClient('mongodb://localhost');
    
    await mc.connect();
    
    if (mc.isConnected()) { ... }
    
    let db = mc.db('test');
    let collection = db.collection("test");
    
    ...
    
    await mc.close();
    
        2
  •  1
  •   kevinadi    8 年前

    如果您同时启动所有容器,MongoDB容器可能不会在应用程序容器之前启动。

    你可以 Control startup order in Compose 确保MongoDB容器在应用程序容器之前启动,例如使用 depends_on 指令。从链接页上的示例:

    version: "2"
    services:
      web:
        build: .
        ports:
          - "80:8000"
        depends_on:
          - "db"
        command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
      db:
        image: mongodb
    

    但是请注意,如 depends_on documentation ,它不是一个完整的解决方案,因为它只等待容器启动,而不一定要等到数据库启动。

    你需要使用 取决于 与脚本结合 wait-for-it 以确保数据库实际启动。

    推荐文章