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



我对如何使用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]

这很好,但它实际上会在数据库可用时立即连接。那也很好,但是承诺已经被拒绝了,我无论如何都没有使用该连接。我也尝试切换到使用回调,但失败后再也不会调用回调。

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

我要么需要一种方法来使用最初失败的连接,要么阻止失败的连接重试。有没有人知道如何做到这一点?

Node.js MongoDB驱动程序的3.0版本为您提供了一些额外的灵活性,因为您可以创建自己的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();

如果你同时启动容器,MongoDB容器可能不会在你的应用容器之前启动。

您可以在撰写中控制启动顺序,以确保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文档中所述,它不是一个完整的解决方案,因为它只等到容器启动,不一定等到数据库启动。

您需要将depends_on与 wait-for-it 等脚本结合使用,以确保数据库实际启动。

最新更新