Mongoose连接开启认证的MongoDB报createIndexes需认证如何排查
故障排查结论
报错MongoServerError: command createIndexes requires authentication的核心原因是Mongoose连接配置的认证参数格式错误,驱动实际发起连接时没有携带正确的身份凭证,加上配置项存在拼写错误、用户权限冗余两个次要问题,最终触发鉴权失败。
具体问题点&修复方案
认证参数嵌套错误
你当前把用户名、密码放在auth对象下的写法是旧版MongoDB驱动的格式,Mongoose v6及以上版本内置的驱动不会读取该嵌套字段,导致连接时实际未传入认证信息。
修正方式:将用户名、密码直接放在连接配置的顶层,字段名使用user和pass,不要嵌套auth层。配置项拼写错误
你写的useNewURLParser存在驼峰拼写错误,正确的选项名是useNewUrlParser,拼写错误会导致该解析器选项不生效。
注:如果使用Mongoose v7+版本,useNewUrlParser和useUnifiedTopology已经默认开启,可直接删除这两个配置项,不会影响连接。数据库用户权限冗余
你给用户同时配置了readWrite和read角色,readWrite本身已经包含所有读权限,重复配置read虽然不会直接触发本次报错,但可能导致后续权限判断异常,建议清理冗余角色。
修正后可直接使用的代码
连接配置代码
//Set MongoDB options const db_options = { authSource: 'admin', user: process.env.MONGODBUSER, pass: process.env.MONGODBPASS, // Mongoose v6及以下版本保留下面两个选项,v7+可删除 useNewUrlParser: true, useUnifiedTopology: true, }; //Connect to MongoDB mongoose.connect(process.env.MONGODBURL, db_options); const db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', () => { console.log('Database Connected'); });
用户权限修正命令
登录MongoDB的admin库后执行以下命令,清理冗余角色:
db.updateUser( "dbUser", { roles: [ { role: "readWrite", db: "projectDbLocal" } ] } )
额外校验项
- 确认环境变量
MONGODBURL的格式正确,标准格式为mongodb://<数据库地址>:27017/projectDbLocal,不要在连接串中重复拼接用户名密码,避免和配置项的认证信息冲突。 - 确认数据库服务端开启的认证机制和客户端匹配,你当前的用户同时支持SCRAM-SHA-1和SCRAM-SHA-256,默认配置即可兼容,不需要额外指定authMechanism参数。
修改完成后重启Node服务即可正常连接,创建索引的操作会自动携带认证信息通过鉴权。
内容的提问来源于stack exchange,提问作者RichardODonoghue
相关产品推荐
相关产品推荐

