使用Mongoose连接MongoDB Atlas时添加数据库名触发认证失败
问题原因及解决方案
你遇到的认证失败问题,核心是连接字符串与Mongoose配置的认证信息冲突,以及认证源的优先级逻辑导致的:
为什么加数据库名会触发错误?
当你在连接字符串末尾添加/lorien指定目标数据库时,同时又在mongoose.connect的配置里重复设置了user、pass和authSource:admin,会导致MongoDB客户端的认证逻辑出现冲突。此外,若连接字符串未明确指定authSource,部分场景下客户端会默认尝试用你指定的lorien数据库作为认证源,但你的账号example是在admin库下创建的,自然会认证失败。
而当你去掉数据库名时,MongoDB默认会使用admin库作为认证源,刚好和你配置里的authSource:admin匹配,因此能成功连接。
解决办法(二选一即可)
办法1:统一用连接字符串传递所有参数
修改.env中的连接字符串,明确指定认证源,同时删除代码里重复的认证配置:
DB_URI=mongodb://example:examplePassword@x.x.x.x:27017/lorien?authSource=admin
修改connection.js:
const mongoose = require('mongoose'); require('dotenv').config(); mongoose.connect(process.env.DB_URI, { useNewUrlParser: true, useUnifiedTopology: true }).then(() => { console.log('Test db connected successfully'); }) .catch((err) => { console.log("Error", err); });
办法2:连接字符串只传地址和数据库,代码保留认证配置
修改.env去掉连接字符串中的用户名密码:
DB_URI=mongodb://x.x.x.x:27017/lorien
connection.js的配置保持不变即可,此时代码里的authSource:admin会生效,客户端会先在admin库完成认证,再连接到lorien数据库。
补充说明
Mongoose 6.x及以上版本已默认启用useNewUrlParser和useUnifiedTopology,如果你使用的是新版本,可直接移除这两个配置参数简化代码。
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

