我对 Node 很菜鸟,但发现 activedirectory 包比任何替代 Python 模块都要好得多,可以在 AD 森林中提取递归组成员,因此,这是完成这项工作的正确工具。我以前用 JS 做过很多工作,但显然这是另一回事。
基本上,我有以下内容:
var ad = new ActiveDirectory(config);
const groupName = 'CN=myGroupName*'
let group_members = []
ad.findGroups(groupName, function(err, groups) {
groups.forEach(function(group) {
ad.getUsersForGroup(group.dn, function(err, users) {
users.forEach(function(user) {
group_members.push([group.cn, user.sAMAccountName])
})
})
})
})
问题是这工作得很好,但我接下来需要做的是将结果放入数据库,但我无法获得正确的时间。我已将其添加到测试中:
setTimeout(function() {
console.log(group_members)
return
}, 5000)
这可行,但显然不理想。
不幸的是,我一直使用 Node.js 6(使用 AWS Lambda),所以我什至无法使用 Promises AFAIK。有谁知道我该如何正确地做到这一点?
最佳答案
您需要将用户数组映射到处理一个用户时解析的 Promise 数组,以便您可以使用 Promise.all 等待所有 Promise 完成:
const done = new Promise(res => {
ad.findGroups(groupName, function(err, groups) {
res(Promise.all(groups.map(function(group) {
return new Promise(res => {
ad.getUsersForGroup(group.dn, function(err, users) {
users.forEach(function(user) {
group_members.push([group.cn, user.sAMAccountName])
});
res();
});
})));
});
});
所以你可以这样做:
done.then(() => console.log(group_members));
<小时/>
或者,您可以 promise API 并使用新的 async/await 语法:
const {promisify} = require("util");
const findGroups = promisify(ad.findGroups);
const getUsersForGroups = promisify(ad.getUsersForGroups);
(async function(){
const groupMembers = [];
const groups = await findGroups(groupName);
for(const group of groups){
const users = await getUsersForGroups(group.dn);
for(const user of users)
groupMembers.push([group.cn, user.sAMAccountName]);
}
//all done
console.log(groupMembers);
})()
(但是,这将处理一个又一个请求)
关于javascript - 带 activedirectory 包的 Node.js 计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48006200/