2

我正在为我的项目使用 ldapjs 库和标准 LDAP 服务器,并且我正在尝试使用 search()。在我想返回结果之前,它可以正常工作。

所以我相信这更多的是我对 javascript 如何工作而不是库的误解,因为它工作正常 console.log

其次,我不确定我是否正确有效地使用了嵌套搜索()。

任何帮助,将不胜感激

function getPhones() {

  return new Promise((resolve, reject) => {
  let phones = [];
  const opts = {
    filter: `(objectClass=Phone)`,
    scope: 'sub',
    // attributes: ['*'],
  };
     client.search(`cn=${callserver.cn},cn=Modules`, opts, function (err, res) {
        if (err) {
          console.log('Error in promise', err);
        }
        res.on('searchEntry',  function  (entry) {
          let newPhone = {};
          const opts2 = {
            filter: `(objectClass=*)`,
            scope: 'sub',
          };
           client.search(`${entry.object.dn}`, opts2, function (err, res) {
            res.on('searchEntry', function (entry2) {
              newPhone = entry2.object;
              console.log(newPhone); //here its logging just fine with all attributes
            });
          });
          console.log(newPhone);// here newPhone is empty
          phones.push(
            { ...entry.object, details: newPhone } 

            // followMeTo: entry.object.followMeTo,
            // telephoneNumber: parseInt(entry.object.telephoneNumber),
          );
        });
        res.on('end', function () {
          resolve(phones);
        });
        res.on('err', function () {
          reject('Error');
        });
      });
}
}

更新1:如果我尝试按照建议使用:

    client.search(`${entry.object.dn}`, opts, function (err, res) {
            res.on('searchEntry', function (entry2) {
              phones.push({ ...entry.object, detail: entry2.object });
            });
          });

在这里我无法访问电话阵列,或者没有任何东西被推入其中,所以我必须这样做:

    client.search(`${entry.object.dn}`, opts, function (err, res) {
            res.on('searchEntry', function (entry2) {
            });
            phones.push({ ...entry.object, detail: entry2.object });
          });

但在这里我无法访问 entry2 :-(

现在失去理智

4

1 回答 1

0

我不熟悉这个 API,但看起来你的代码是这样的:

function getPhones() {
  return new Promise((resolve, reject) => {
    let phones = [];
    const opts = {
      filter: `(objectClass=Phone)`,
      scope: "sub"
    };
    client.search(`cn=${callserver.cn},cn=Modules`, opts, function (err, res) {
      if (err) {
        console.log("Error in promise", err);
      }
      res.on("searchEntry", function (entry) {
        const opts = {
          filter: `(objectClass=*)`,
          scope: "sub"
        };
        client.search(`${entry.object.dn}`, opts, function (err, res) {
          res.on("searchEntry", function (entry2) {
            phones.push({
              ...entry.object,
              ...{
                details: entry2.object
              }
            });
          });
        });
        res.on("end", function () {
          resolve(phones);
        });
        res.on("err", function () {
          reject("Error");
        });
      });
    });
  });
}

以下代码的问题:

client.search(`${entry.object.dn}`, opts2, function (err, res) {
    res.on('searchEntry', function (entry2) {
        newPhone = entry2.object;
        console.log(newPhone); //here its logging just fine with all attributes
    });
});
console.log(newPhone);// here newPhone is empty

是 JS 执行client.search()这是一个异步操作,并且不等待响应继续执行console.log(newPhone);.

所以这里的解决方法是在成功回调中简单地将手机推送到结果中。


旁注:如果您想编写“看起来”同步的代码,您也可以查看async await

于 2021-03-13T11:22:30.270 回答