【问题标题】:How can I access the key passed to hgetall when using node_redis?使用 node_redis 时如何访问传递给 hgetall 的密钥?
【发布时间】:2012-09-28 19:39:51
【问题描述】:

我有一个 node.js (express) 应用程序,我正在使用 node_redis 从我的 redis 数据库中获取所有用户。

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。

【问题讨论】:

    标签: node.js redis node-redis


    【解决方案1】:

    您需要通过在循环中引入一个函数来使用闭包来存储 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"}} ]
    

    【讨论】:

    • 这就是我想要的。非常感谢你。你让我开心!
    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2022-11-20
    • 2019-06-29
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    相关资源
    最近更新 更多