2016-11-13 38 views
0

我有一个简单的模块与几个功能与活动目录进行交互。Node.js:将模块函数从回调转换为承诺与蓝鸟

使用标准的回调风格,代码工作得很好:

/** 
* 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的promisified版本,其中蓝鸟非常简单。

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