2016-09-26 73 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); 
       }); 
      } 
     }); 
    } 
});