2

node.js (express) アプリケーションがあり、node_redis を使用して redis db からすべてのユーザーを取得しています。

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

1 に答える 1

4

ループに関数を導入して、クロージャを使用して user_id を格納する必要があります。これを行う 1 つの方法は、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"}} ]
于 2012-10-08T19:25:22.373 に答える