我有一个在后端运行的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。我想知道为什么司机不会在这种情况下工作。
答案 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上询问的数据库管理主题。
该软件的设计与设计一样,就像这里的测试案例所证明的那样。