Javascript Node.js:使用Bluebird将模块函数从回调转换为承诺
我有一个简单的模块,其中包含两个与Active Directory交互的函数 使用标准回调样式,代码工作正常:Javascript Node.js:使用Bluebird将模块函数从回调转换为承诺,javascript,node.js,callback,promise,bluebird,Javascript,Node.js,Callback,Promise,Bluebird,我有一个简单的模块,其中包含两个与Active Directory交互的函数 使用标准回调样式,代码工作正常: /** * mylib.js **/ const ActiveDirectory = require('activedirectory'); // Instantiate AD client const ad = new ActiveDirectory({ url: 'ldaps://...', baseDN: 'DC=...', }); module.exports =
/**
* 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}`);
});
下一步是重构我的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}`);
});
因此,状态
似乎没有被解析
如果我将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)
>节点client.js
成功:未定义
/Users/../mylib.js:84
如果(错误)抛出错误;
^
错误:连接错误
在Object.exports.\u errnoException(util.js:1036:11)
在导出时。主机端口例外(util.js:1059:20)
在TCPConnectWrap.afterConnect[as oncomplete](net.js:1080:14)
我做错了什么?无法理解。您对
Promise.method()
的期望太高了,从中抛出的错误或返回的值确实会被Promise包装,但这不是您要做的-您正在从ad.authenticate的回调抛出/返回
您需要的是一个预期版本的ad.authenticate
,Bluebird使之非常简单
module.exports = {
// Authenticate user against AD
authenticate: Promise.promisify(ad.authenticate)
};
您对Promise.method()的期望过高,从中抛出的错误或返回的值确实会被Promise包装,但这不是您要做的-您正在从ad.authenticate的回调抛出/返回 您需要的是一个预期版本的
ad.authenticate
,Bluebird使之非常简单
module.exports = {
// Authenticate user against AD
authenticate: Promise.promisify(ad.authenticate)
};
尝试返回ad.authenticate(…)的结果
return ad.authenticate()
如果这不起作用,请将此方法包装在另一个promise中并返回它。如果您选中,您将看到它在执行异步时返回一个承诺。请尝试返回ad.authenticate(…)的结果return ad.authenticate()
如果这不起作用,请将此方法包装在另一个promise中并返回它。如果您检查,您将看到它在执行异步时返回一个承诺。
module.exports = {
// Authenticate user against AD
authenticate: Promise.promisify(ad.authenticate)
};