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