无法通过Shell及Mongoose连接MongoDB,Robo 3T可正常连接
我之前也碰到过一模一样的情况!Robo 3T能顺利连上,但用Mongoose就报认证失败,大概率是这几个细节没处理好,你可以挨个排查:
明确指定认证数据库
Robo 3T在连接时会默认使用admin数据库做认证(尤其是root用户),但你的连接字符串里把tbAuth设为了默认数据库,Mongoose会尝试用这个库去做认证,而root用户通常是在admin库下创建的,自然会失败。修改连接字符串,加上authSource参数指定认证库:let url = 'mongodb://root:PASSWORD@10.0.1.185:27017/tbAuth?authSource=admin';检查密码的URL编码
如果你的密码里包含@、:、/这类URL特殊字符,Robo 3T会自动帮你处理编码,但Mongoose直接用原字符串的话会导致连接解析错误。比如密码是Pass@123,要转成Pass%40123再放到连接字符串里。适配认证机制或升级Mongoose
若你的MongoDB服务器版本是4.0+,默认用SCRAM-SHA-256认证机制,而旧版Mongoose可能默认使用SCRAM-SHA-1,两者不兼容会导致认证失败。可以在连接选项里指定机制,或者升级Mongoose到最新稳定版:mongoose.connect(url, { auto_reconnect: true, authMechanism: 'SCRAM-SHA-256' })确认用户权限配置
虽然Robo 3T能连接,但还是要确认root用户是否有权限访问tbAuth数据库。在Robo 3T里切换到admin库,执行以下命令检查用户权限:use admin; db.getUser('root');确保用户的
roles里包含对tbAuth的读写权限,或者拥有root超级角色(默认应该有,但以防配置异常)。
我当时就是因为没加authSource参数导致的问题,加上之后立刻就正常连接了,你可以先试试第一个方案,应该能解决大部分情况!
内容的提问来源于stack exchange,提问作者Silve2611

