2012-10-08 54 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 

這將產生以下結果:

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

現在我想被添加到用戶的結果user_ID的,這樣我就可以得到以下的輸出:

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

問題我的是,client.hgetall()異步調用,我不能簡單地訪問for循環中的user_id。

回答

4

您需要通過在循環中引入一個函數來使用閉包來存儲user_id。一種方法是使用forEach函數在數組上進行迭代。

這裏是在Javascript中的例子:

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

相關問題