Ber*_*rtC 3 mongoose mongodb typescript docker replicaset
连接到在 Docker 中运行的 MongoDB(带有 ReplicaSet)在 5.13.9 中可以正常工作,但在 6.0.8 中失败
\n这是数据库的 docker-compose.yml 文件:
\nversion: \'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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n代码位于 Typescript 中,对于 5.13.9 Mongoose 版本,我使用以下代码:
\nmongoose.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 });\nRun Code Online (Sandbox Code Playgroud)\n这里需要指定useNewUrlParser和useUnifiedTopology,否则会报错。
\n结果是它工作正常。该程序正在连接到数据库,我可以向其中写入内容。
\n6.0.8 的代码略有不同:
\nmongoose.connect(\'mongodb://localhost:27017/logger?replicaSet=rs0\')\n .then(() => {\n app.listen(PORT, () => {\n console.log(`Listening on ${PORT} for Log Messages`);\n });\n });\nRun Code Online (Sandbox Code Playgroud)\nuseNewUrlParser 和 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\nRun Code Online (Sandbox Code Playgroud)\n使用 Mongoose 6.0.8 连接到在 Docker 中运行的 Mongo Standalone ReplicaSet 的正确方法是什么?
\n当我尝试从本地主机连接到 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 中指定的主机。
| 归档时间: |
|
| 查看次数: |
1761 次 |
| 最近记录: |