簡體   English   中英

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

[英]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 Container中:

$ 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 連接到在 Docker 中運行的 Mongo Standalone ReplicaSet 的正確方法是什么?

當我嘗試從本地主機連接到 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 中指定的主機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM