2016-11-13 5 views
0

Ich habe ein einfaches Modul mit ein paar Funktionen, um mit einem Active Directory zu interagieren.Node.js: Konvertieren von Modulfunktionen von Callbacks zu Versprechen mit Bluebird

den Standard-Callback-Stil verwenden, funktioniert der Code einfach gut:

/** 
* mylib.js 
**/ 

const ActiveDirectory = require('activedirectory'); 

// Instantiate AD client 
const ad = new ActiveDirectory({ 
    url: 'ldaps://...', 
    baseDN: 'DC=...', 
}); 

module.exports = { 
    // Authenticate user against the AD 
    authenticate: (username, password, callback) => { 
    // Authentication request 
    ad.authenticate(username, password, (err, status) => { 
     callback(err, status); 
    }); 
    }, 
}; 

/** 
* client.js 
**/ 

const mylib = require('./mylib'); 

mylib.authenticate('<username>', '<password>', (err, status) => { 
    if (err) { 
    console.log(`Error: ${err}`); 
    return; 
    } 
    console.log(`Success: ${status}`); 
}); 

Execution Ergebnis:

> node client.js 
Success: true 

Der nächste Schritt war meine lib Methode Refactoring Promises zu verwenden, anstatt Rückrufe:

/** 
* mylib.js 
**/ 

const ActiveDirectory = require('activedirectory'); 
const Promise = require('bluebird'); 

//... 

module.exports = { 
    // Authenticate user against AD 
    authenticate: Promise.method((username, password) => { 
    ad.authenticate(username, password, (err, status) => { 
     if (err) throw err; 
     return status; 
    }); 
    }), 
}; 

/** 
* client.js 
**/ 

const mylib = require('./mylib'); 

myLib.authenticate('<username>', '<password>').then((status) => { 
    console.log(`Success: ${status}`); 
}).catch((err) => { 
    console.log(`Error: ${err}`); 
}); 

Ausführungsergebnis:

> node client.js 
Success: undefined 

So sieht es aus wie die status wird nicht aufgelöst.

Wenn ich den AD-Server-URL zu etwas anderem (zu zwingen, Fehler eine Verbindung und sehen Sie die Ablehnung) ändern Ich kann sowohl die Entschlossenheit sehen und die Ablehnung Protokoll:

> node client.js 
Success: undefined 

/Users/.../mylib.js:84 
     if (err) throw err; 
      ^

Error: connect ECONNREFUSED <IP> 
    at Object.exports._errnoException (util.js:1036:11) 
    at exports._exceptionWithHostPort (util.js:1059:20) 
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1080:14) 

Was mache ich falsch? Kann es nicht herausfinden.

+0

Versuchen Sie, das Ergebnis von ad.authenticate (...) zurückzugeben. 'return ad.authenticate()' Wenn dies nicht funktioniert, wickeln Sie diese Methode in eine andere Versprechen und zurück. Wenn Sie die [docs] (http://bluebirdjs.com/docs/api/promise.method.html) überprüfen, sehen Sie, dass bei async eine Zusage zurückgegeben wird. – bpinhosilva

Antwort

2

Sie erwarten zu viel von Promise.method(), von dem ein geworfener Fehler oder ein zurückgegebener Wert in der Tat in Aussicht gestellt wird, aber das ist nicht das, was Sie tun - Sie werfen/zurück vom Callback von ad.authenticate.

Was Sie wollen, ist eine promisifizierte Version von ad.authenticate, die Bluebird extrem einfach macht.

module.exports = { 
    // Authenticate user against AD 
    authenticate: Promise.promisify(ad.authenticate) 
}; 
Verwandte Themen