我非常喜欢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。有没有人有任何想法我怎么做到这一点?
答案 0 :(得分:0)
您需要将用户数组映射到处理一个用户时解析的Promise数组,这样您就可以等待所有Promise使用Promise.all完成:
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));
或者,您可以宣传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);
})()
(但这将继续一个请求)