gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:28:17 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com