使用redis,nodejs查找在线/离线用户数

时间:2017-04-10 05:26:56

标签: node.js redis

我正在使用socket.io,redis来跟踪用户的在线/离线状态。在这里,我将使用模式hub_id存储名称为key的no.of用户。我只需获得与hub_ pattern匹配的键数就可以获得用户数。现在,密钥具有在线或离线状态的价值。

我无法得到否。用户在线或离线变量在for循环之外。

  app.get('/test', function(req, res) {
  client.keys('hub*', function (err, keys) {
    console.log(keys.length);
    for (var i=0; i<keys.length; i++){
    client.hgetall(keys[i], function(err, reply) {
    if(reply.status == "online"){
      onlinehub++;
    }
    else if(reply.status == "offline"){
      offlinehub++;
    }
  });
  }
    console.log(onlinehub +"-" +offlinehub)

    });
});

1 个答案:

答案 0 :(得分:0)

在这里,您无法访问onlinehubofflinehub外部for循环,因为这些变量在异步函数调用中更新,即

client.hgetall(keys[i], function(err, reply) { //<-- this is callback function
if(reply.status == "online"){
  onlinehub++;
}
else if(reply.status == "offline"){
  offlinehub++;
}
console.log(onlinehub +"-" +offlinehub); //Put the log here and check if it is giving correct numbers?
});

因此,您只能在该异步回调函数中访问onlinehubofflinehub变量的更新值。现在,您必须在控制台上登录 0-0

要修复,您可以查看以下代码

app.get('/test', function(req, res) {
    //Defined a callback function to know when counting on redis keys finished
    var onComplete = function() {
       console.log(onlinehub+"-"+offlinehub);
    };
    client.keys('hub*', function (err, keys) {
        console.log(keys.length);
        var taskToGo = keys.length;
        if(taskToGo==0){
           onComplete();
       }else{
          for (var i=0; i<keys.length; i++){
              client.hgetall(keys[i], function(err, reply) {
                  if(reply.status == "online"){
                    onlinehub++;
                  }
                  else if(reply.status == "offline"){
                      offlinehub++;
                  }
                  //Added this line 
                  if(--taskToGo==0){ 
                     onComplete();
                  }
                });
          }
       }
    });
});

您可以从async for loop in node.js

获取帮助