在使用 Mongoose 连接 MongoDB 的过程中,有时会遇到“MongoError: no primary found in replicaset” 错误,这是由于 MongoDB 的 Replica Set 配置有误导致的。本文将详细介绍这个问题的产生原因以及解决方法。
问题原因
MongoDB 的 Replica Set 是一组 MongoDB 服务器的集合,用于提供高可用性和可伸缩性。Replica Set 中的每个节点都可以承担不同的角色,如 Primary(主节点),Secondary(从节点)等。Mongoose 连接 MongoDB 时,会尝试连接 Replica Set 中的 Primary 节点。
当 Replica Set 中没有 Primary 节点时,就会出现 “MongoError: no primary found in replicaset” 错误。这种情况通常是由于以下原因之一引起的:
- Replica Set 中所有节点都处于下线状态,没有可用节点承担主节点角色。
- Mongoose 配置的连接字符串不正确,无法正确识别 Replica Set 中的主节点。
无论出现哪种情况,都会导致 Mongoose 无法连接 MongoDB,从而产生 “MongoError: no primary found in replicaset” 错误。
解决方法
解决 “MongoError: no primary found in replicaset” 错误的方法主要有两种:检查 MongoDB Replica Set 配置和修改 Mongoose 配置。
检查 MongoDB Replica Set 配置
在 MongoDB Replica Set 中,必须有一个节点承担 Primary(主节点)的角色。如果没有主节点,就会出现 “MongoError: no primary found in replicaset” 错误。
要检查 MongoDB Replica Set 中是否有可用的主节点,可以运行以下命令:
rs.status()
如果输出结果中没有任何节点承担主节点角色,就需要手动指定一个节点为主节点。具体的操作步骤如下:
- 进入 MongoDB Replica Set 中的任意一个节点。
- 使用以下命令启动 MongoDB Shell:
mongo
- 运行以下命令:
rs.initiate()
通过这个命令,可以手动将当前节点指定为主节点,从而解决 “MongoError: no primary found in replicaset” 错误。
修改 Mongoose 配置
如果 MongoDB Replica Set 配置正确,但 Mongoose 配置有误,也会导致 “MongoError: no primary found in replicaset” 错误的产生。在这种情况下,需要修改 Mongoose 配置中的连接字符串,以正确识别 MongoDB Replica Set 中的主节点。
在 Mongoose 连接 MongoDB 时,可以指定以下连接字符串:
mongodb://<user>:<password>@<node1>:<port>/<databaseName>?replicaSet=<replicaSetName>&authSource=<authDatabase>
其中,各参数含义如下:
<user>
: 数据库用户名<password>
: 数据库密码<node1>
: Replica Set 中的节点主机名(可指定多个节点,以逗号分隔)<port>
: MongoDB 服务器的端口号(通常为 27017)<databaseName>
: 数据库名称<replicaSetName>
: Replica Set 的名称<authDatabase>
: 认证数据库名称
要解决 “MongoError: no primary found in replicaset” 错误,需要确保 <replicaSetName>
参数指定的名称与 MongoDB Replica Set 的名称一致。
以下是一个示范代码,用于连接 MongoDB Replica Set 中的主节点:
const mongoose = require('mongoose'); const uri = "mongodb://user:password@node1,node2,node3/mydb?replicaSet=myReplicaSet"; mongoose.connect(uri, {useNewUrlParser: true, useUnifiedTopology: true}) .then(() => console.log('Connected to MongoDB')) .catch((err) => console.log('Error: ' + err));
在上面的代码中,要将 <replicaSetName>
参数指定为 myReplicaSet
,以正确识别 MongoDB Replica Set 中的主节点。
总结
在使用 Mongoose 连接 MongoDB 时,可能会遇到 “MongoError: no primary found in replicaset” 错误。要解决这个问题,需要检查 MongoDB Replica Set 的配置是否正确,以及修改 Mongoose 的连接字符串,以正确识别 MongoDB Replica Set 中的主节点。我们希望本文能够帮助读者解决这个问题,并顺利使用 Mongoose 连接 MongoDB。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6546fa3a7d4982a6eb15feee