2016-04-26 18 views
0

私は、ldapjsで、実行するためのフィルタが最初の検索Ldap.js:ネストされた検索

ldapClient.search(base1, opts1, (err1, res1) => { 
    res1.on("searchEntry", entry => { 
     const myObj = { attr1: entry.object.attr1 } 
     const opts2 = { filter: entry.object.filter } 

     if (entry.object.condition == myCondition) { 
      ldapClient.search(base2, opts2, (err2, res2) => { 
       res2.on("searchEntry", entry => { 
        myObj.attr2 = entry.object.attr2 
       }); 
      }); 
     } 

     console.log(myObj); 
    }); 
}); 

の結果に依存しているため、検索をしようとしている問題はにconsole.logは私が表示されたら、ということです2番目の検索のイベント ".on"はまだ習得されていません。

オブジェクトを表示する前に、2番目のイベントが完了するのを待つようにコードを指示するにはどうすればよいですか?

おかげ

答えて

0

はnum8erありがとうございます。

私は最終的にldapjsと約束

ldapClient.bind(dn, password).then(() => { 

    let p; 

    ldapClient.search(base1, opts1).then(res1 => { 
     const entry = res1.entries[0].object; 
     const myObj = { attr1: entry.attr1 }; 

     if (entry.condition == myCondition) { 
      const opts2 = { filter: entry.filter } 
      p = ldapClient.search(base2, opts2).then(res2 => { 
       const entry2 = res2.entries[0].object; 
       myObj.attr2 = entry2.attr2; 
       return myObj; 
      }); 
     } else { 
      p = Promise.resolve(myObj); 
     } 

     p.then(value => console.log("Obj", value); 
    }); 
}); 
に基づいて、 "約束し-LDAP" モジュールを使用
0

あなたがあるため、非同期動作のconsole.log(myObj)

を行うときは、第二の検索仕上がりを待つためにきたイベントの結果を見ることができません。

ldapClient.search(base1, opts1, (err1, res1) => { 
    res1.on("searchEntry", entry => { 
     let myObj = { attr1: entry.object.attr1 } 
     let opts2 = { filter: entry.object.filter } 

     if (entry.object.condition == myCondition) { 
      ldapClient.search(base2, opts2, (err2, res2) => { 
       res2.on("searchEntry", entry => { 
        myObj.attr2 = entry.object.attr2 
        console.log("res2", myObj); 
       }); 
      }); 
      return; 
     } 

     console.log("res1", myObj); 
    }); 
}); 

もエレガントなコードのためにあなたが好きで、それを使用することができます:あなたは ".on" の内側にそれを置くことをしました

const async = require('async'); 

function ldapSearch(base, opts, callback) { 
    ldapClient.search(base, opts, (err, res) => { 
    if(err) return callback(err); 

    res.on("searchEntry", entry => { 
     callback(null, entry); 
    }); 
    }); 
} 

async.waterfall([ 
    function(done) { 
    ldapSearch(base1, opts1, done); 
    }, 
    function(entry, done) { 
    if (entry.object.condition != myCondition) { 
     return done("Condition not met"); 
    } 

    let myObj = { attr1: entry.object.attr1 }; 
    let opts2 = { filter: entry.object.filter }; 
    ldapSearch(base2, opts2, (err, entry) => { 
     myObj.attr2 = entry.object.attr2; 
     done(null, myObj); 
    }); 
    } 
], 
function(err, myObj) { 
    if(err) { 
    console.error(err); 
    return; 
    } 

    console.log('MyObj', myObj); 
}); 
関連する問題