如何从nodejs驱动程序获取mongodb角色列表?

时间:2017-11-03 03:04:59

标签: node.js mongodb

我有一个在后端运行的mongos,并希望使用nodejs驱动程序来查询用户角色列表。我正在使用的代码是:

db.db('admin').command({ rolesInfo: 1, showBuiltinRoles: true })
.then((roleList) => {
      console.log('role list', roleList);
    })
    .catch((err) => {
      console.error(err);
    });

它在单个mongo实例和副本集上工作正常。但是当连接到mongos时,它总是返回空列表。如果我通过mongo shell为同一个mongos服务器运行此命令,它会给我正确的输出:

db.runCommand({rolesInfo: 1, showBuiltinRoles:true})

mongos版本为3.4.4,nodejs驱动版本为2.2。我想知道为什么司机不会在这种情况下工作。

1 个答案:

答案 0 :(得分:0)

这不是软件问题。您的设置中可能存在权限问题,但这不是一个主题,并且很容易生成一个简单的测试用例。

如前所述,只需执行一个分片测试环境,启动没有数据库连接的shell:

mongo --nodb

然后设置测试环境可以创建数据的目录:

MongoRunner.dataPath = '/path/to/test/'

启动一个简单的分片群集进行测试:

new ShardingTest({ shards: 2, mongos: 1 })

检查运行mongos的端口。我的是20005。然后你可以简单地在shell中运行命令,或者通过nodejs程序运行:

const uri = 'mongodb://localhost:20005/test';

function log(data) {
  console.log(JSON.stringify(data,undefined,2))
}

(async function() {

  let db;

  try {

    db = await MongoClient.connect(uri);

    let admin = db.admin();

    let result = await admin.command({ rolesInfo: 1, showBuiltinRoles: 1 });

    log(result);


  } catch(e) {
    console.error(e);
  } finally {
    db.close();
  }

})()

或者如果你真的必须使用mongoose,但它只是从底层驱动程序获取对象:

const mongoose = require('mongoose');

const uri = 'mongodb://localhost:20005/test',
      options = { useMongoClient: true };

function log(data) {
  console.log(JSON.stringify(data,undefined,2))
}

(async function() {

  try {

    const conn = await mongoose.connect(uri,options);

    let admin = conn.db.admin();

    let result = await admin.command({ rolesInfo: 1, showBuiltinRoles: 1 });

    log(result);


  } catch(e) {
    console.error(e);
  } finally {
    mongoose.disconnect();
  }

})()

无论如何,它都会返回角色列表:

{
  "roles": [
    {
      "role": "__system",
      "db": "admin",
      "isBuiltin": true,
      "roles": [],
      "inheritedRoles": []
    },
    {
      "role": "backup",
      "db": "admin",
      "isBuiltin": true,
      "roles": [],
      "inheritedRoles": []
    },
    {
      "role": "clusterAdmin",
      "db": "admin",
      "isBuiltin": true,
      "roles": [],
      "inheritedRoles": []
    },
    ...

如上所述,群集中可能存在权限问题或其他配置问题。您应确保用户具有viewRole,但实际上"角色访问"是您可以在dba.stackexchange.com上询问的数据库管理主题。

该软件的设计与设计一样,就像这里的测试案例所证明的那样。