javascript 如何处理ldapjs搜索方法中的错误

niwlg2el  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(104)

我必须连接到LDAP服务器并根据特定ID查找用户。
我决定使用ldapjs模块。
我设法创建了我的客户端并绑定了他,这样我就可以成功地搜索用户。
我的问题是,因为我只使用async/await,所以我不知道如何处理回调中的错误。例如,使用ldapjs库中的以下简单代码:

public static async search(searchOptions: SearchOptions) {
    LdapService.bind()

    LdapService.getClient()?.search('ou=*****,ou=***,dc=****,dc=****', searchOptions, function (err, res) {
      ifError(err)

      res.on('searchEntry', function (entry) {
        // ----------------------
        // an error came from here
        throw new Error('test') 
        // ----------------------

        console.log('entry: ' + JSON.stringify(entry.object));
      });

      res.on('searchReference', function (referral) {
        console.log('referral: ' + referral.uris.join());
      });

      res.on('error', function (err) {
        console.error('error: ' + err.message);
      });

      res.on('end', function (result) {
        console.log('status: ' + result?.status);
      });
    })
  }
  • LdapService.getClient()* 是一个单例方法,它返回createClient ->的结果
  • LdapService.bind()* 是一个只与服务器绑定正确凭证的方法->工作正常

我只是无法处理我的错误“测试”。我该怎么办?
搜索方法真的是异步的吗?
我可以使用async/await的方式吗?:P

PS:由于安全原因,DN字符串(“ou=,ou=,dc=,dc=”)被隐藏,代码运行良好,不会抛出错误;)

fumotvh3

fumotvh31#

对于任何经过这里并像我一样挣扎于回调的人,这里是我发现的“修复”:

public static async search(searchOptions: SearchOptions) {
    // wrapping the all thing in a Promise that can be in a try/catch -> error will be handled there
    return await new Promise((resolve, reject) => {
      LdapService.getClient()?.search('ou=****,ou=****,dc=****,dc=****', searchOptions, function (err, res) {
        if (err) {
          // handle connection error I guess ?
          reject(err)
        }

        res.on('searchEntry', function (entry) {
          try {
            // -------------
            // Same test as before
            throw new Error('test')
            // -------------

            resolve(JSON.stringify(entry.object))
          } catch (err) {
            // error must be catched to call reject method !
            reject(err)
          }
        });

        res.on('error', function (err) {
          // handle API error when looking for the specific ID I guess ?
          reject(err)
        });
      })
    })
  }

什么解决了我的问题?把所有的东西都 Package 在一个承诺里。
之前所有的“res.on”方法都类似于Promise侦听器。因此,all方法搜索(我的内部)是一种异步调用。
现在我可以调用resolve/reject方法来返回数据和错误。
另外,我可以用async/await的方式调用静态搜索方法。
当你不熟悉回调的时候。。^^”

j8yoct9x

j8yoct9x2#

还有另一种方法。由于ldapjs中的Client对象是enEventEmitter,因此可以启用'captureRejections'布尔值。
详情:https://nodejs.org/api/events.html#error-events
文档示例:

import { EventEmitter } from 'node:events';

EventEmitter.captureRejections = true;
const ee1 = new EventEmitter();
ee1.on('something', async (value) => {
  throw new Error('kaboom');
});

ee1.on('error', console.log);

在构建客户端时,您可以将此作为一个选项传递,然后.on处理程序的行为就会好得多。一旦将其添加到客户端,所有的绑定和搜索函数也会使用它。

async buildLdapClient() {
    return new Promise((resolve, reject) => {

        const options: ClientOptions = {
            url: ldaps://something.here.not.there.com:636,
            connectTimeout: 5000,
            timeout: 5000,
            reconnect: false,
            captureRejections: true
        }

        let client = ldapjs.createClient(options);

        client.on('timeout', (error) => {
            reject(error);
        });

        client.on('connectTimeout', (error) => {
            reject(error);
        });

        client.on('timeLimit', (error) => {
            reject(error);
        });

        client.on('error', (error) => {
            reject(error);
        });

        resolve(client);

    });
}

相关问题