Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:使用Bluebird将模块函数从回调转换为承诺_Javascript_Node.js_Callback_Promise_Bluebird - Fatal编程技术网

Javascript Node.js:使用Bluebird将模块函数从回调转换为承诺

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 =

我有一个简单的模块,其中包含两个与Active Directory交互的函数

使用标准回调样式,代码工作正常:

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