1

我在 nodejs 中使用 ldapjs 库。我想在函数之外访问 client.search 的结果。这是我的代码

items = [];
  client.search('cn=users,dc=test,dc=com', opts, function (err, res) {
    if (err)
      console.log(err);
    res.on('searchEntry', function (entry) {
      items.push(entry.object);
    });
    res.on('error', function (err) {
      console.error('error: ' + err.message);
    });
    res.on('end', function (result) {
      console.log('status: ' + result.status); 
      console.log(items[0]);  **//Prints results correctly**   
    });
  });
console.log(items[0]); **//Prints []**

我尝试在搜索中返回项目。还是不打印。有什么建议么?

4

2 回答 2

1

我遇到了同样的问题。由于 res.on 'searchEntry' 是一个事件发射器,我使用的一个简单解决方案是将整个事情包装在一个承诺中并返回它。

let search = function( 'cn=users,dc=test,dc=com', opts ) {

return new Promise( ( resolve, reject ) => { 
  items = [];
      client.search('cn=users,dc=test,dc=com', opts, function (err, res) {
        if (err)
          console.log(err);
          reject( err )
        res.on('searchEntry', function (entry) {
          items.push(entry.object);
        });
        res.on('error', function (err) {
          console.error('error: ' + err.message);
          reject( error )
        });
        res.on('end', function (result) {
          console.log('status: ' + result.status); 
          console.log(items[0]);  **//Prints results correctly**
          resolve( items )   
        });
      });
   }
};

然后你可以做这样的事情:

let entries = await search( 'cn=users,dc=test,dc=com', opts );
于 2020-08-05T16:24:53.250 回答
0

您可以使用包装函数和回调

function search(dn, options, callback){
  // your code ...
  res.on('end', function (result) {
    callback(items);
  }
});

并这样称呼它

search(dn, options, function(err, result) {
    //your result ...
    console.log(result);
}
于 2018-05-15T15:23:07.923 回答