繁体   English   中英

带有Active Directory包的Node.js计时

[英]Node.js timing w/ activedirectory package

我对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。 有谁知道我如何正确执行此操作?

您需要将用户数组映射到一个Promises数组,该数组可在处理一个用户时进行解析,因此您可以等待所有Promises使用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);
})()

(但是,这将继续处理一个请求)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM