node.js - 使用redis,nodejs查找在线/离线用户数

标签 node.js redis

我正在使用 socket.io、redis 来跟踪用户在线/离线状态。在这里,我使用 hub_id 模式存储以名称为键的用户数。我可以通过获取与 hub_ 模式匹配的键数来获取用户数量。现在 key 具有在线或离线状态的值(value)。

我无法获得编号。 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)

    });
});

最佳答案

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

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 寻求帮助

关于node.js - 使用redis,nodejs查找在线/离线用户数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43315547/

相关文章:

redis - ServiceStack Redis 客户端发生意外错误

spring-boot - Spring Data Redis 与 Spring Session Data Redis

node.js - 测试 netlify 函数和 Gatsbyjs 2 时的 ECONNRESET

android - 无法将Android上的socket io与服务器nodejs连接

node.js - 使用测试数据库测试 Strongloop REST api

java - 带有 Spring 和 Redis 的 Vaadin 在缓慢的环境中加载以前的 UI 状态

node.js 代码保护

javascript - 使用 Puppeteer 抓取 SPAN 数组中的文本以获取 div ID

redis - loop get vs mget,redis lua是否有性能差异?

c# - 如何为 Redlock.Net 启用日志记录?