MongoDB 连接时的**认证参数配置错误**
该错误是 MongoDB 连接时的认证参数配置错误,核心原因是 MongoCredential
(认证凭证)中缺少“认证数据库名”(source
字段为空),导致 MongoDB 无法识别认证范围,最终连接超时失败。以下是分步解决方案:
一、错误核心原因解析
MongoDB 认证时需要明确“基于哪个数据库验证账号密码”(默认是 admin
数据库,除非手动在其他库创建账号)。你的连接代码中,MongoCredential
的 source
字段为空(source=''
),MongoDB 无法确定认证数据库,抛出“databaseName is not empty
”异常,进而导致连接超时。
二、解决方案:补充“认证数据库名”
根据 MongoDB 账号的创建场景(默认 admin
库或自定义库),分两种情况配置连接:
1. 情况1:账号在默认 admin
库创建(最常见)
若你的 root
账号是在 admin
数据库下创建的(MongoDB 默认管理员账号存储在 admin
库),连接时需指定 source="admin"
(即认证数据库为 admin
)。
示例代码(Java 驱动为例):
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import java.util.Arrays;public class MongoConnTest {public static void main(String[] args) {// 1. 配置认证信息:必须指定 source(认证数据库名,这里是 admin)MongoCredential credential = MongoCredential.createCredential("root", // 用户名"admin", // 认证数据库名(关键!不能为空,默认填 admin)"你的密码".toCharArray() // 密码);// 2. 配置服务器地址(localhost:27017)ServerAddress serverAddress = new ServerAddress("localhost", 27017);// 3. 建立连接MongoClient mongoClient = new MongoClient(serverAddress, Arrays.asList(credential));// 4. 测试连接(查询数据库列表,无异常则成功)System.out.println(mongoClient.listDatabaseNames().into(new ArrayList<>()));}
}
2. 情况2:账号在自定义数据库创建(非 admin 库)
若你的 root
账号是手动在其他数据库(如 mydb
)下创建的(例如 use mydb; db.createUser(...)
),则 source
需填该自定义数据库名(如 source="mydb"
)。
示例(以自定义库 mydb
为例):
// 认证数据库改为自定义的 mydb
MongoCredential credential = MongoCredential.createCredential("root", "mydb", // 自定义认证数据库名"你的密码".toCharArray()
);
三、额外排查步骤(确保基础环境正常)
-
确认 MongoDB 服务已启动
执行命令检查服务状态(Windows):net start MongoDB
;(Linux):systemctl status mongod
,确保服务处于“运行中”。 -
验证账号密码正确性
通过mongo
shell 手动登录,确认账号密码无误:# 1. 连接 MongoDB(先不认证) mongo localhost:27017# 2. 切换到认证数据库(如 admin) use admin# 3. 执行认证(替换为你的账号密码) db.auth("root", "你的密码")# 若返回 1 表示认证成功;返回 0 表示账号/密码错误
若
db.auth
返回 0,需先重置密码(如db.changeUserPassword("root", "新密码")
)。 -
检查端口是否被占用
执行命令查看 27017 端口是否被 MongoDB 占用(Windows):netstat -ano | findstr "27017"
;(Linux):netstat -tuln | grep 27017
,确保端口未被其他程序占用。
四、总结
该错误的关键修复点是给 MongoCredential
补充“认证数据库名”(source
字段),默认填 admin
(99% 的场景适用),若账号在自定义库创建则填对应库名。补充后重新连接,即可解决“databaseName is not empty
”和连接超时问题。