Redis + Node.js Цикл по элементам набора

Здесь я добавляю набор users. У каждого user есть userID и socketID:

 socket.on('login', function(userID){
      console.log('io.sockets.on -- socket.on -- userID: ' + userID);
      console.log('socket.id = ' + socket.id);

      var user = userID;

      // add first user
      redis.sadd("users", user);
      redis.hmset(user, "socketID", socket.id, "userID", userID);  
    });    

Здесь я пытаюсь получить все users в наборе и перебрать их:

    // Get the list of online users and show Presence
    redis.smembers("users", function(err,results) {

        var onlineUsers = results;

        console.log("onlineUsers = " + onlineUsers);

        for (var onlineUser in onlineUsers) {

            console.log("onlineUser = " + onlineUser);

            var userID = redis.hget(onlineUser,"userID", function(err,reply) {
                console.log("onlineUser hget: " + reply);
                data = JSON.parse(reply);
                console.log("data: " +data);

            });       
    });

И вот логи:

16:41:15 web.1  | onlineUsers = user:AuY0Uopq6X,user:YbgtwQs8Vt
16:41:16 web.1  | onlineUser = 0
16:41:16 web.1  | onlineUser = 1
16:41:16 web.1  | onlineUser hget: null
16:41:16 web.1  | data: null
16:41:16 web.1  | onlineUser hget: null
16:41:16 web.1  | data: null

Меня очень смущает node-redis и то, как просто получить userIDs. Я знаю, что они там, потому что onlineUsers содержит их, но тогда я делаю что-то не так в итерации!


РЕДАКТИРОВАТЬ

Я попытался использовать redis-cli, и ключ есть:

redis 127.0.0.1:6379> SMEMBERS users
1) "user:AuY0Uopq6X"
2) "user:YbgtwQs8Vt"
redis 127.0.0.1:6379> HKEYS "user:AuY0Uopq6X"
1) "socketID"
redis 127.0.0.1:6379> 

Все еще не повезло получить их с приведенным выше кодом.


РЕДАКТИРОВАТЬ - РЕШЕНО

У меня были проблемы с тем, как я НАСТРОЙКИ И ПОЛУЧЕНИЯ данных. Я не устанавливал «пользовательский хеш» на правой клавише для «набора пользователей». Вот правильная версия:

  var user = userID;

  // add first user
  redis.sadd("users", user);
  redis.hmset("users:"+user, "socketID", socket.id, "userID", userID);

Однако мне также нужно было реализовать изменение Филиппа Т при ПОЛУЧЕНИИ хэша пользователя.


person OdieO    schedule 02.07.2014    source источник
comment
Вы проверили, каково значение ошибки в обратном вызове вашей команды hget?   -  person Philippe T.    schedule 03.07.2014
comment
16:56:26 веб.1 | ошибка: ноль   -  person OdieO    schedule 08.07.2014
comment
Все ноль! Я подозреваю, что for (var onlineUser in onlineUsers) не дает мне объект для onlineUser   -  person OdieO    schedule 08.07.2014


Ответы (1)


Я думаю, что вы получаете индекс элементов «пользователей» вместо значений, попробуйте следующее:

 // Get the list of online users and show Presence
redis.smembers("users", function(err,results) {

    var onlineUsers = results;

    console.log("onlineUsers = " + onlineUsers);

    for (var i in onlineUsers) {

        console.log("onlineUser = " + i);
        console.log("onlineUser = " + onlineUsers[i]);


        var userID = redis.hget(onlineUsers[i],"userID", function(err,reply) {
            console.log("onlineUser hget: " + reply);
            data = JSON.parse(reply);
            console.log("data: " +data);

        });       
});
person Philippe T.    schedule 08.07.2014
comment
ХОРОШО. Это сбивает с толку. Что такое results? Разве это не просто массив отдельных users? Вы получаете индекс в цикле for, но затем, когда вы передаете onlineUsers[i] в hget, вы в конечном итоге передаете то же самое, что и при передаче onlineUser, верно? - person OdieO; 08.07.2014
comment
При этом я получил значение от hget, когда использовал ваш код... Я просто пытаюсь понять, почему оно отличается. - person OdieO; 08.07.2014
comment
когда вы выполняете итерацию в своем операторе for in, у вас есть индекс массива. Итак, чтобы получить имя, вам нужно получить значение из массива и использовать его в hget. В вашем коде i = onlineuser = индекс элемента - person Philippe T.; 09.07.2014
comment
как бы вы это сделали, если бы у вас было несколько client.multi()... iterate и все элементы... client.execute() - person PirateApp; 21.12.2017