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

相关问题