我正在使用 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 循环之外的 onlinehub
和 offlinehub
是因为这些变量在异步函数调用中更新,即
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?
});
因此您只能在该异步回调函数中访问 onlinehub
和 offlinehub
变量的更新值。现在您在控制台上的日志一定是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/