Bluebird可以在node.js中使用redis吗?

这里是我原来的代码来获取存储在redis中的用户php会话:

var session_obj; var key = socket.request.headers.cookie.session session.get('PHPREDIS_SESSION:'+key,function(err,data){ if( err ) { return console.error(err); } if ( !data === false) { session_obj = PHPUnserialize.unserializeSession(data); } /* ... other functions ... */ }) 

我想用Promise重写代码,但是我不能得到返回的data

 Promise.resolve(session.get('PHPREDIS_SESSION:'+key)).then(function(data){ return data; }).then(function(session){ console.log(session); // this returns true, but not the session data session_obj = PHPUnserialize.unserializeSession(session); }).catch(function(err){ console.log(err); }) 

session返回布尔值true而不是会话数据。 原始的redis get函数有两个参数。 我承诺这个承诺只是返回了原来的err的第一个参数。 所以我试了

  Promise.resolve(session.get('PHPREDIS_SESSION:'+key)).then(function(err,data){ console.log(data) // return undefined }) 

但它也没有工作。

有谁知道redis是否可以与Promise一起工作?

你试图使用Promise.resolve错误,它期望一个Promise和session.get默认不返回一个Promise。 你首先需要做出承诺 。 (或promisifyAll )

 session.getAsync = Promise.promisify(session.get); // OR Promise.promisifyAll(session); //=> `session.getAsync` automatically created // OR Promise.promisifyAll(redis); //=> Recursively promisify all functions on entire redis 

然后使用返回promise的新函数,就像使用promise一样,甚至不需要用Promise.resolve来包装它,只需要这样做:

 session.get('PHPREDIS_SESSION:' + key). then(function(data) { // do something with data }). catch(function(err) { // handle error with err });