如何使用 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 中指定的主机。
在 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 中指定的主机。