복붙노트

[REDIS] 어떻게 node_redis를 사용하는 경우 hgetall에 전달 된 키에 액세스 할 수 있습니까?

REDIS

어떻게 node_redis를 사용하는 경우 hgetall에 전달 된 키에 액세스 할 수 있습니까?

나는 Node.js를 (명시 적) 응용 프로그램이 있고 나는 나의 레디 스 DB에서 모든 사용자를 얻을 수 node_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에 액세스 할 수 있다는 것입니다.

해결법

  1. ==============================

    1.당신은 루프 기능을 도입하여 저장 USER_ID에 폐쇄를 사용해야합니다. 그것을 할 수있는 한 가지 방법은 배열에 반복 foreach는 함수를 사용하는 것입니다.

    당신은 루프 기능을 도입하여 저장 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"}} ]
    
  2. from https://stackoverflow.com/questions/12783683/how-can-i-access-the-key-passed-to-hgetall-when-using-node-redis by cc-by-sa and MIT license