2012-10-08 3 views
2

node.js (express) 애플리케이션이 있고 node_redis를 사용하여 redis db에서 모든 사용자를 얻습니다.node_redis를 사용할 때 hgetall에 전달 된 키에 어떻게 액세스 할 수 있습니까?

redis = require "redis" 
client = redis.createClient() 

client.smembers "users", (err, user_ids) -> 
    results = new Array() 
    for user_id in user_ids 
    client.hgetall user_id, (err, items) -> 
     results.push items 
     if user_ids.length is results.length 
     res.json results 

이것은 다음과 같은 결과를 생성합니다

[ 
    { 
    "user:1": { 
     "name": "user1", 
     "password": "secret" 
    } 
    }, 
    { 
    "user:2": { 
     "name": "user2", 
     "password": "secret" 
    } 
    } 
] 

문제 :

지금
[ 
    { 
    "name": "user1", 
    "password": "secret" 
    }, 
    { 
    "name": "user2", 
    "password": "secret" 
    } 
] 

나는 USER_ID 사용자 결과에 추가, 그래서 다음과 같은 출력을 얻을 수 있습니다 원하는을 나는 가지고있다 client.hgetall()은 비동기 적으로 호출되며 for 루프의 user_id에 단순히 액세스 할 수 없다.

답변

4

루프에 함수를 도입하여 user_id를 저장하려면 클로저를 사용해야합니다. 이를 수행하는 한 가지 방법은 forEach 함수를 사용하여 배열을 반복하는 것입니다.

var redis = require('redis') 
var client = redis.createClient(); 

function fetch(callback) { 
    var results = new Array(); 
    client.smembers("users", function(err,users) { 
     if (users.length == 0) 
     return callback(results); 
     users.forEach(function(id) { 
     client.hgetall(id, function(err,items) { 
      var obj = {}; 
      obj[id] = items; # here id can be accessed since it is part of the closure 
      results.push(obj); 
      if (results.length == users.length) { 
       callback(results); 
      } 
     }); 
     }); 
    }); 
} 

fetch(function(results) { 
    console.log(JSON.stringify(results)); 
}); 

출력은 다음과 같습니다 : 여기

자바 스크립트의 예입니다

내가 찾던 무엇
[ {"user:2":{"name":"user2","password":"secret2"}}, 
    {"user:1":{"name":"user1","password":"secret"}} ] 
+0

. 너무 감사합니다. 오늘은 진짜 너 덕분이다! – bekite

+0

나는 그것을 이해하지 못한다. 그러나 그것은 효과가있다 :) – reabow