MongoDB认证失败报错:无已认证用户,无法连接服务器求助
解决MongoError: "there are no users authenticated" 连接问题
看起来你遇到的核心问题是认证上下文不匹配,加上代码里有个小语法错误,咱们一步步来排查:
1. 先修复代码里的语法bug
你的MongoClient.connect调用最后少了一个闭合的),这会导致代码执行失败,先补上:
MongoClient.connect('mongodb://user:password@127.0.0.1:27017/QUIZ_GAME',(err,client)=>{ if(err){ // 建议把错误信息也打出来,方便排查具体问题 return console.log('unable to connect to the MongoDb server', err); } const db = client.db('QUIZ_GAME'); console.log('connected to the MongoDb server'); }) // 这里补上缺失的闭合括号
2. 匹配用户与认证数据库
MongoDB的用户是绑定到特定数据库的,你的连接字符串没指定authSource(认证来源库),导致MongoDB默认用你要连接的QUIZ_GAME库去验证用户,但你创建的用户分两种情况:
情况A:用admin库的root用户连接
你在admin库创建了admin用户(拥有root权限),但连接字符串里用的是user,而且没指定authSource=admin,MongoDB找不到这个用户。修改连接字符串如下:
// 注意用户名改成admin,加上?authSource=admin指定认证库 MongoClient.connect('mongodb://admin:password@127.0.0.1:27017/QUIZ_GAME?authSource=admin',(err,client)=>{ // ... 其他代码 })
情况B:用QUIZ_GAME库的专属用户连接
你提到在QUIZ_GAME库创建用户但没写完,先确保用户创建完整,比如:
# 在Putty里执行完整的用户创建命令 use QUIZ_GAME db.createUser( { user: "quiz_user", pwd: "your_secure_password", roles: [ { role: "readWrite", db: "QUIZ_GAME" } ] } )
然后用这个用户连接(不需要指定authSource,因为用户就在QUIZ_GAME库):
MongoClient.connect('mongodb://quiz_user:your_secure_password@127.0.0.1:27017/QUIZ_GAME',(err,client)=>{ // ... 其他代码 })
3. 确认MongoDB已启用认证
确保你的MongoDB实例启动时开启了认证机制:
- 如果是命令行启动,要加
--auth参数:mongod --auth --dbpath /your/db/path - 如果是配置文件启动(mongod.conf),要设置:
security: authorization: enabled
如果没开启认证,你创建的用户不会生效,但你的错误提示是认证问题,大概率已经开启,但还是要确认下。
4. 用mongo shell测试连接(快速验证)
先通过shell测试连接是否正常,排除代码之外的问题:
- 用admin用户测试:
mongo "mongodb://admin:password@127.0.0.1:27017/QUIZ_GAME?authSource=admin" - 用QUIZ_GAME用户测试:
mongo mongodb://quiz_user:your_secure_password@127.0.0.1:27017/QUIZ_GAME
如果shell能成功连接,说明用户和密码没问题,再回到代码排查;如果shell也连接失败,检查用户名/密码拼写,或者用户是否创建成功。
内容的提问来源于stack exchange,提问作者roh_dev




