2016-09-26 53 views
2

我在使用LDAPjs的LDAP存储库中有关于searchEntry的一些问题。我对LDAP不是很熟悉,因此我可能会在客户端实现中丢失一些东西。问题是,在一段时间之后,LDAP没有来自LDAP服务器的响应,只是没有任何回调被调用。ldapjs在特定时间段内连接超时

const ldapClient = ldap.createClient({ 
     url: 'ldap://some.ldap.server', 
     timeout: 3000, 
     connectTimeout: 6000 
    }); 

    ldapClient.search('c=XX', opts, (err, res) => { 
    if (err) { 
     ldapClient.unbind(function(err) { 
     if (err) { 
      console.log(err) 
     } 
     }); 
     return next(null); 
    } 
    res.once('searchEntry', (entry) => { 
    ldapClient.unbind(function(err) { 
     if (err) { 
     console.log(err) 
     } 
    }); 
    return next(entry); 
    }); 

    res.on('error', (error) => { 
    ldapClient.unbind(function(err) { 
     if (err) { 
     console.log(err) 
     } 
    }); 
    return next(null, new Error(error.message)); 
    }); 
}); 

回答

1

传递reconnect标志作为true在创建LDAP客户端和你做的方式不解除绑定。我想这也阻碍了重新连接。只有在成功搜索后才能取消绑定。

此代码的工作对我来说:(该值当然是假的)

var ldap = require('ldapjs'); 
var tlsOptions = { 
    host: 'example.com', 
    port: '636', 
    ca: [fs.readFileSync('./path/to/cert.pem')] 
}; 
var client = ldap.createClient({ 
    url: 'ldaps://example.com:636', 
    reconnect: true 
    tlsOptions: tlsOptions 
}); 

client.bind(username, password, function (err) { 
    if (err) { 
     console.log('Error occurred while binding'); 
    } else { 
     var base = 'cn=admin,dc=example,dc=com'; 
     var search_options = { 
      scope: 'sub', 
      filter: '(&(objectClass=*)(CN=' + username + '))', 
      attrs: 'attrs' 
     }; 
     client.search(base, search_options, function (err, res) { 
      if (err) { 
       console.log('Error occurred while ldap search'); 
      } else { 
       res.on('searchEntry', function (entry) { 
        console.log('Entry', JSON.stringify(entry.object)); 
       }); 
       res.on('searchReference', function (referral) { 
        console.log('Referral', referral); 
       }); 
       res.on('error', function (err) { 
        console.log('Error is', err); 
       }); 
       res.on('end', function (result) { 
        console.log('Result is', result); 
       }); 
      } 
     }); 
    } 
});