使用MongoDB NodeJS驱动3.0.1创建普通用户时遇认证错误求助
解决MongoDB NodeJS驱动创建普通用户时的认证错误问题
嘿,我看了你的代码和配置,问题其实出在几个容易忽略的细节上,导致创建普通用户时触发了未认证的错误。咱们一步步来梳理和修复:
问题根源分析
- 误用未认证的客户端实例:你成功创建管理员后,虽然通过认证URL连接了新的
authClient,但后续创建普通用户时,却还是用了最开始那个没有认证的client来获取数据库实例——这就难怪MongoDB会提示你没有用户认证了。 - Promise回调参数顺序错误:
adminDb.addUser()返回的是Promise,它的then回调第一个参数是成功结果,不是错误对象,你写的function(err, result)完全搞反了,这会导致后续逻辑出现异常。 - 过时API的使用:在MongoDB NodeJS驱动3.x版本里,
addUser已经被标记为过时,官方更推荐使用createUser方法来创建用户,能避免一些兼容性问题。
修正后的完整代码
我把你的代码调整了一下,用Promise链式调用让逻辑更清晰,同时修复了上面的问题:
const MongoClient = require('mongodb').MongoClient; const format = require('util').format; const config = require("./config.json"); const adminUser = process.argv[2]; const adminPassword = process.argv[3]; const url = `mongodb://${config.database.location}:${config.database.port}`; const authURL = `mongodb://%s:%s@${config.database.location}:${config.database.port}/?authMechanism=SCRAM-SHA-1&authSource=admin`; if (!adminUser || !adminPassword) { throw new Error("Please enter administrator username and password!\nUsage:\tnode init.js <adminUserName> <adminPassword>\n\n"); } MongoClient.connect(url) .then(client => { console.log("Connected successfully to server"); const adminDb = client.db('admin').admin(); // 使用createUser创建管理员用户 return adminDb.createUser({ user: adminUser, pwd: adminPassword, roles: [{ role: "userAdminAnyDatabase", db: "admin" }] }).then(() => client); }) .then(client => { // 关闭未认证的初始连接 client.close(); // 用认证URL建立新的已认证连接 return MongoClient.connect(format(authURL, encodeURIComponent(adminUser), encodeURIComponent(adminPassword))); }) .then(authClient => { console.log('Authenticated Successfully'); // 使用已认证的客户端获取目标数据库 const targetDb = authClient.db(config.database.name); // 创建普通用户 return targetDb.createUser({ user: config.database.auth.username, pwd: config.database.auth.password, roles: [{ role: "readWrite", db: config.database.name }] }).then(() => authClient); }) .then(authClient => { console.log("Setup completed!"); authClient.close(); }) .catch(err => { console.error(err.stack); process.exit(1); });
额外注意事项
- 确保你的mongod进程是重启过的,因为修改
mongod.cfg中的authorization: "enabled"后,必须重启服务才能让配置生效。 - 如果你之前删除过数据库,重启mongod后会自动重建,不用担心数据丢失的问题(毕竟你是在初始化用户)。
内容的提问来源于stack exchange,提问作者Ozil
相关产品推荐
相关产品推荐

