javascript - 带 activedirectory 包的 Node.js 计时

标签 javascript node.js active-directory

我对 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/

相关文章:

javascript - 如何在 iframe 上设置 'X-Frame-Options'?

javascript - 为什么 chrome 标签不起作用?

javascript - knex 中的排水管连接需要比预期更多的时间

asp.net - 如何从 ASP.NET Web 服务代码对 Active Directory 进行身份验证?

c# - 如何在本地测试 Azure ActiveDirectory?

javascript - 如何在 react 中通过单击按钮捕获映射数据?

javascript - 如何将 CSS 样式应用于 Div 的同级标签字段?

javascript - req.body 和 res.render 得到不完整的值

javascript - 使用 Mongoose 更新数组中的子文档

powershell - 在同一行和输出csv上使用Win32_Computersystem和Win32_service