当使用Promise.all时,Node_Redis HGETparsing为布尔数组

我一直在深入研究redis,并且使用redis进行工作,因为它只是数据存储(我知道这不是redis的预期目的,但是我从学习命令和整体使用Node上的redis获益) m使用Node_Redis。

这是我想完成的(所有在redis中):我尝试使用他们的电子邮件检索用户。

问题在于:我有一个Promise.all调用,它接收所有的电子邮件(键)并映射到HGET命令。 当Promise.all解决我期望它用一个用户对象数组解决,但它最终解决了一个布尔值数组(即[true,true,true])。

这是/users的逻辑

 router.get("/", (req, res) => { client.lrange("emails", 0, 1, (err, reply) => { if (err) return console.log(err); if (reply) { Promise.all( reply.map(email => { return client.hgetall(email, (err, reply) => { if (err) return console.log(err); console.log("reply for hgetall", reply); // this prints a user object correct, but Promise.all still resolves to boolean array :( return reply; }); }) ) .then(replies => { // replies = [true, true, true ...] res.send(replies); }) .catch(e => console.log(e)); } else { res.send([reply, "reply is null"]); } }); }); 

我实际上已经使用了Promise.all了很多次,当我从redislogin回复时,它也显示了正确的对象,所以我现在很困惑。 我怎么能得到Promise.all解决一个用户对象的数组?

问题是client.hgetall不返回一个承诺。 这是asynchronous函数,你传递一个callback来获得结果。 你应该promisify这个function在Promise.all使用它:

 ... return new Promise((resolve, reject) => { client.hgetall(email, (err, reply) => { if (err) { return reject(err); } resolve(reply); }); }); 

您可以手动进行promisification (如上例所示),也可以使用BluebirdQ库及其promisifypromisifyAll方法。