2015-06-06 75 views
0

我想將以下代碼轉換爲使用promise。它正在工作並在活動目錄中輸出用戶的屬性。使用ldapjs承諾

var client = ldap.createClient({ 
    url: ldap_url 
}); 

client.bind(ldap_username, ldap_password, function (err) { 
    client.search(ldap_dn_search, opts, function (err, search) { 
     search.on('searchEntry', function (entry) { 
      var user = entry.object; 
      // It is working!!!. It outputs all user attributes. 
      console.log(user); 
     }); 

    }); 
}); 

以下是我的嘗試,butit不輸出任何內容。

var Promise = require('promise'); 
var client_bind = Promise.denodeify(client.bind); 
var client_search = Promise.denodeify(client.search); 

client_bind(ldap_username, ldap_password) 
.then(function(err){ 
    client_search(ldap_dn_search, opts) 
    .then(function(search){ 
     var search_on = Promise.denodeify(search.on); 
     search_on('searchEntry') 
     .then(function(entry){ 
      var user = entry.object; 

      // It doesn't output anything !!! 
      console.log(user); 
     }); 
     }); 

    }); 
+0

沒有錯誤信息? – Bergi

回答

0

最有可能的這些方法都需要在client作爲背景被調用,所以你需要bind()他們將它們傳遞給Promise.denodeify前:

var client_bind = Promise.denodeify(client.bind.bind(client)); 
var client_search = Promise.denodeify(client.search.bind(client)); 

此外,正確使用承諾會看起來像這樣:

client_bind(ldap_username, ldap_password).then(function() { 
    return client_search(ldap_dn_search, opts); 
// ^^^^^^ always return something from the callback 
}).then(function(search) { // flatten your chain 
    return Promise.denodeify(search.on).call(search, 'searchEntry'); 
//         ^^^^^^ an alternative to `bind` 
}).then(function(entry){ 
    var user = entry.object; 
    console.log(user); 
}).catch(function(err) { // always catch errors! 
    console.error(err); 
}); 
+0

我使用了您提供的代碼。我得到錯誤:UNABLE_TO_VERIFY_LEAF_SIGNATURE,即使我有process.env ['NODE_TLS_REJECT_UNAUTHORIZED'] ='0';在我的劇本的最頂端。 – kenpeter

+0

這似乎不是承諾的問題,是嗎? – Bergi

+0

我不確定。如果我將它切換回原始代碼,它將與process.env ['NODE_TLS_REJECT_UNAUTHORIZED'] ='0'一起工作;如果將代碼更改爲:「return Promise.denodeify(search.on).call(search,'searchEntry');」返回'某物';異常停止。 – kenpeter

0

使用藍鳥承諾,簡單的方法來做到這一點是正常創建你的客戶端,然後運行公關客戶端上的omisifyAll()。

var ldap = require('ldapjs'); 
var Promise = require('bluebird'); 

var client = ldap.createClient({ 
    url: 'ldap://my-server:1234', 
}); 

Promise.promisifyAll(client); 

現在你可以調用client.addAsync()和client.searchAsync()等等。

client.bindAsync(secUserDn, secUserPassword) 
    .then(doSearch) // if it works, call doSearch 
    .catch(function (err) { // if bind fails, handle it 
    console.error('Error on bind', err) 
    }); 

function doSearch(data) { 
    client.searchAsync('CN=A Test,OU=Users,DC=website,DC=com', options) 
    .then(function (data) { // Handle the search result processing 
     console.log('I got a result'); 
    }) 
    .catch(function (err) { // Catch potential errors and handle them 
     console.error('Error on search', err); 
    }); 
} 
+0

與[這裏](http://stackoverflow.com/a/32009340/1048572)的答案相同嗎?如果您認爲問題重複,請投票結束,而不是複製答案。 – Bergi

+0

他們非常接近,但他們都出現在類似問題的搜索結果的頂部。無論如何,我沒有這種能力。我想你需要3k代表關閉/重新投票。 –

1

我有同樣的問題。搜索發出事件,所以我們需要一些處理它們並沿着鏈條進一步傳遞的事物。 下面是一段代碼,這對我的作品:

var ldap = require('ldapjs'); 
var promise = require('bluebird'); 

var client = ldap.createClient({url: app.settings['ldap']['server']}); 
var uid; 

promise.promisifyAll(client); 

function searchPromise(res, notfoundtext) { 
    return new Promise(function(resolve, reject) { 
    var found = false; 
    res.on('searchEntry', function(entry) { 
     found = true; 
     resolve(entry); 
    }); 
    res.on('error', function(e) { 
     reject(e.message); 
    }); 
    res.on('end', function() { 
     if (!found) { 
     reject(notfoundtext); 
     } 
    }); 
    }); 
} 

client.searchAsync(app.settings['ldap']['baseDn'], {filter: '(mail='+credentials.email+')', scope: 'sub'}) 
    .then(function(res) { 
    return searchPromise(res, 'User isn\'t exists.'); 
    }) 
    .then(function (entry) { 
    uid = entry.object.uid; 
    return client.bindAsync(entry.object.dn, credentials.password); 
    }) 
    .then(function() { 
    return client.searchAsync('cn='+app.settings['ldap']['group']+',cn=groups,'+app.settings['ldap']['baseDn'], {scope: 'sub', filter: '(memberUid='+uid+')'}); 
    }) 
    .then(function(res) { 
    return searchPromise(res, 'User is not in group ' + app.settings['ldap']['group']); 
    }) 
    .then(function() { 
    console.log('All is ok'); 
    }) 
    .catch(function(message) { 
    console.log('Error:' + message); 
    }); 

後立即搜索我加一個步驟,捕捉的事件,對其進行處理,並進一步將它傳遞的鏈條。這使得功能searchPromise。

祝你好運編碼)