You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MongoDB NodeJS驱动3.0.1创建普通用户时遇认证错误求助

解决MongoDB NodeJS驱动创建普通用户时的认证错误问题

嘿,我看了你的代码和配置,问题其实出在几个容易忽略的细节上,导致创建普通用户时触发了未认证的错误。咱们一步步来梳理和修复:

问题根源分析

  1. 误用未认证的客户端实例:你成功创建管理员后,虽然通过认证URL连接了新的authClient,但后续创建普通用户时,却还是用了最开始那个没有认证的client来获取数据库实例——这就难怪MongoDB会提示你没有用户认证了。
  2. Promise回调参数顺序错误:adminDb.addUser()返回的是Promise,它的then回调第一个参数是成功结果,不是错误对象,你写的function(err, result)完全搞反了,这会导致后续逻辑出现异常。
  3. 过时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:33:08