2016-04-26 13 views
0

ich mit ldapjs auszuführen bin versucht, für die eine Suche der Filter ist abhängig von dem Ergebnis einer ersten SuchLdap.js: verschachtelte Suche

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); 
    }); 
}); 

Das Problem ist, dass, wenn console.log zeigt meine Objekt am Ende wurde das Ereignis ".on" meiner zweiten Suche noch nicht verraten.

Also, wie kann ich meinen Code auf das zweite Ereignis warten zu beenden, bevor das Objekt anzeigen?

Dank

Antwort

0

Danke num8er.

habe ich endlich das "gelobte-ldap" Modul, basierend auf ldapjs und verspricht

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); 
    }); 
}); 
0

Sie können nicht Ergebnis der Veranstaltung sehen, wenn Sie console.log(myObj)

tun Sie wegen asynchroner Verhalten haben für die zweite Such Finish zu warten.

Sie haben, um es innerhalb von ".auf":

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); 
    }); 
}); 

auch für eleganten Code können Sie es gerne verwenden:

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); 
});