如何使用 Mongoose 6.0.8 连接到在 Docker 中运行的 Mongo Standalone ReplicaSet?

Ber*_*rtC 3 mongoose mongodb typescript docker replicaset

连接到在 Docker 中运行的 MongoDB(带有 ReplicaSet)在 5.13.9 中可以正常工作,但在 6.0.8 中失败

\n

数据库的 docker-compose.yml:

\n

这是数据库的 docker-compose.yml 文件:

\n
version: \'3.9\'\n\nservices:\n\n  loggerdb:\n    image: mongo\n    container_name: loggerdb\n    command: ["--replSet", "rs0", "--bind_ip_all", ]\n    restart: always\n    ports:\n      - "27017:27017"\n    volumes:\n      - ./data:/data/db\n    environment:\n      MONGO_INITDB_DATABASE: logger\n\nnetworks:\n  default:\n    external: true\n    name: logger-network\n
Run Code Online (Sandbox Code Playgroud)\n

如您所见,没有身份验证,并且数据库正在本地主机上侦听 27017。

\n

数据库运行在Docker容器中:

\n
$ docker ps -a\nCONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS       PORTS                                           NAMES\nb42adb1e26ec   0bcbeb494bed   "docker-entrypoint.s\xe2\x80\xa6"   3 hours ago   Up 3 hours   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   loggerdb\n
Run Code Online (Sandbox Code Playgroud)\n

连接代码 (5.13.9)

\n

代码位于 Typescript 中,对于 5.13.9 Mongoose 版本,我使用以下代码:

\n
mongoose.connect(\'mongodb://localhost:27017/logger\', { useNewUrlParser: true, useUnifiedTopology: true })\n    .then(() => {\n        app.listen(PORT, () => {\n            console.log(`Listening on ${PORT} for Log Messages`);\n        });\n    });\n
Run Code Online (Sandbox Code Playgroud)\n

这里需要指定useNewUrlParser和useUnifiedTopology,否则会报错。

\n

结果是它工作正常。该程序正在连接到数据库,我可以向其中写入内容。

\n

连接代码 (6.0.8)

\n

6.0.8 的代码略有不同:

\n
mongoose.connect(\'mongodb://localhost:27017/logger?replicaSet=rs0\')\n    .then(() => {\n        app.listen(PORT, () => {\n            console.log(`Listening on ${PORT} for Log Messages`);\n        });\n    });\n
Run Code Online (Sandbox Code Playgroud)\n

useNewUrlParser 和 useUnifiedTopology 现在已过时,文档显示您需要将 ReplicaSet 指定为参数。

\n

用这段代码连接到6.0.8 Mongoose的结果如下:

\n
[INFO] 14:33:33 ts-node-dev ver. 1.1.8 (using ts-node ver. 9.1.1, typescript ver. 4.3.5)\nMongooseServerSelectionError: getaddrinfo ENOTFOUND b42adb1e26ec\n   [[ Removed the StackTrace ]]\n[ERROR] 14:34:05 MongooseServerSelectionError: getaddrinfo ENOTFOUND b42adb1e26ec\n
Run Code Online (Sandbox Code Playgroud)\n

问题

\n

使用 Mongoose 6.0.8 连接到在 Docker 中运行的 Mongo Standalone ReplicaSet 的正确方法是什么?

\n

88j*_*yto 5

当我尝试从本地主机连接到 docker 内的单节点副本集时,我遇到了这个确切的问题(我还将 mongoose 从 v5 升级到 v6。)

我通过更改连接字符串解决了这个问题

mongodb://admin:pass@127.0.0.1:27017/testdb

mongodb://admin:pass@127.0.0.1:27017/testdb?directConnection=true

看起来 mongoose 强制使用 docker 主机名,只有当您的代码在 docker 内部运行时,该主机名才有效。

directConnection - 指定是否强制将所有操作分派到连接 URI 中指定的主机。