Mongoose 6升级时出现No AuthProvider for DEFAULT defined错误如何解决
问题触发原因
该报错由MongoDB Node.js v4驱动的认证参数校验逻辑变更导致,适配Mongoose 6时该问题会高频出现:
- 你的连接代码无论当前环境是否配置了数据库用户名、密码,都强制在连接URL和连接配置项中传入了
authSource参数 - MongoDB v4驱动对认证参数的校验严格度大幅提升:只要检测到连接配置中存在
authSource类的认证相关参数,但没有对应传入有效的用户名、密码凭据,就会尝试加载默认的DEFAULT认证提供者,而未开启身份校验的本地MongoDB实例不存在该认证提供者,直接抛出该错误。 - 额外补充:Mongoose 6不再自动过滤连接配置中值为
undefined的字段,即使你传入的options.authSource是undefined,也会被透传给驱动触发校验。
解决方案
核心逻辑是无认证场景下不要传递任何认证相关参数,可选改造方案如下:
- 方案1:动态生成连接配置,仅在存在用户名密码的场景下添加authSource
let connectionURL = 'mongodb://'; const connectionOptions = {}; if (options.user && options.password) { connectionURL += `${options.user}:${options.password}@`; connectionURL += `${options.host}/${dbName}?authSource=${options.authSource}`; connectionOptions.authSource = options.authSource; } else { // 无认证场景下不要追加authSource参数 connectionURL += `${options.host}/${dbName}`; } mongoose.connect(connectionURL, connectionOptions, function onConnected(err) { if (err) { return cb(new Error(`Can not connect to database ${dbName}`)); } return cb(null, mongoose.connection); });
- 方案2:本地开发临时调试可直接删除连接URL和connectionOptions中的
authSource配置项,跳过认证校验逻辑即可正常连接。
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

