2017-09-04 2 views
1

저는 redis를 파고 들어 왔고 redis를 데이터 저장소로 사용하는 작은 웹 응용 프로그램에서 작업하고 있습니다 (나는 그것이 redis의 의도 된 목적이 아니라는 것을 알고 있지만 명령을 학습하고 단지 전체 내가 Node_Redis을 사용하고 노드에 레디 스 작업 여기 Node_Redis Promise.all을 사용할 때 부울 배열로 HGET 해결

내가 (모든 레디 스에서) 수행 할 작업은 다음과 같습니다... 내가 그들의 이메일을 사용하여 사용자를 검색하려고 오전

여기에 문제가 있습니다 : 나는 Promise.all 호출을받습니다. 모든 전자 메일 (키) 및 매핑하여 HGET 명령으로 이동합니다. Promise.all이 해결되면 사용자 객체 배열로 해결할 것으로 예상되지만 결국 부울 배열 (즉, [true, true, true])로 끝납니다. 여기

은 실제로 배의 Promise.all에 많이 사용했습니다 /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을 사용하여 사용자 개체의 배열을 해결할 수 있습니까?

답변

2

문제는 client.hgetall이 약속을 반환하지 않는다는 것입니다. 비동기 함수이고 결과를 얻기 위해 콜백을 전달합니다. 당신은 Promise.all에게 그것을 사용하려면이 기능을 promisify해야

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

당신은 (위의 예에서와 같이) 수동 promisification을 수행 할 수 있습니다 또는 promisifypromisifyAll 방법과 Bluebird 또는 Q 라이브러리를 사용할 수 있습니다.