如何使用 Mongoos 6.0.8 连接到 Mongo 独立副本集,运行 in Docker?

How to connect to a Mongo Standalone ReplicaSet, running in Docker, with Mongoose 6.0.8?

在 Docker 中连接到 MongoDB(使用 ReplicaSet)运行 在 5.13.9 中工作但在 6.0.8

中失败

docker-compose.yml 对于数据库:

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

version: '3.9'

services:

  loggerdb:
    image: mongo
    container_name: loggerdb
    command: ["--replSet", "rs0", "--bind_ip_all", ]
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - ./data:/data/db
    environment:
      MONGO_INITDB_DATABASE: logger

networks:
  default:
    external: true
    name: logger-network

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

数据库是 运行 在 Docker 容器中:

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS       PORTS                                           NAMES
b42adb1e26ec   0bcbeb494bed   "docker-entrypoint.s…"   3 hours ago   Up 3 hours   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   loggerdb

连接代码 (5.13.9)

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

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

这里必须指定useNewUrlParser和useUnifiedTopology,否则会报错。

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

连接代码 (6.0.8)

6.0.8 的代码略有不同:

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

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

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

[INFO] 14:33:33 ts-node-dev ver. 1.1.8 (using ts-node ver. 9.1.1, typescript ver. 4.3.5)
MongooseServerSelectionError: getaddrinfo ENOTFOUND b42adb1e26ec
   [[ Removed the StackTrace ]]
[ERROR] 14:34:05 MongooseServerSelectionError: getaddrinfo ENOTFOUND b42adb1e26ec

问题

使用 Mongoose 6.0.8 连接到 Mongo 独立副本集 运行 的正确方法是什么?

我在尝试从本地主机连接到 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 中指定的主机。