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

Node.js: Converting module functions from callbacks to promises with Bluebird

本文关键字:回调 转换 承诺 函数 模块 js 使用 Bluebird Node      更新时间:2023-09-26

我有一个简单的模块,其中包含几个与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}`);
}); 
执行结果:

> node client.js
Success: true

下一步是重构我的lib方法,用Promises代替回调:

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

我做错了什么?看不懂

您对Promise.method()的期望过高,从中抛出的错误或返回的值确实会被承诺包装,但这不是您正在做的-您正在抛出/从ad返回。验证回调。

你想要的是ad.authenticate的承诺版本,Bluebird使其非常简单。

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