2016-11-13 12 views
0

私は、Active Directoryと対話するための2つの関数を持つ単純なモジュールを用意しています。標準のコールバックスタイルを使用してNode.js:モジュール関数をコールバックからBluebirdの約束に変換する

、コードがうまく動作します:

/** 
* 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}`); 
}); 

実行結果:

> node client.js 
Success: true 

次のステップではなく、コールバックの約束を使用するために私のlibメソッドをリファクタリングすることでした。

/** 
* 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}`); 
}); 

実行結果:

> node client.js 
Success: undefined 

したがって、statusが解決されていないようです。

私は何か他のもの(接続エラーを強制し、拒絶反応を見るために)にADサーバのURLを変更した場合、私は解決し、拒絶ログの両方を参照することができます

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

は私が間違って何をしているのですか?それを理解できません。

+0

ad.authenticate(...)の結果を返すようにしてください。 'return ad.authenticate()' これで解決しない場合は、このメソッドを別の約束事でラップして返します。 [docs](http://bluebirdjs.com/docs/api/promise.method.html)をチェックすると、非同期を実行するときに約束を返します。 – bpinhosilva

答えて

2

Promise.method()が多すぎると予想されますが、スローされたエラーまたは返された値が実際に約束されていますが、それはあなたがやっていることではありません - あなたはad.authenticateのコールバックからスロー/リターンしています。

あなたが望むのは、ad.authenticateという有名なバージョンです.Bluebirdは非常に簡単です。

module.exports = { 
    // Authenticate user against AD 
    authenticate: Promise.promisify(ad.authenticate) 
}; 
関連する問題