使用nodejs和redis相当新,但我有一个很短的截止日期项目,而且我遇到了一点墙。
我正在编写一个脚本,用于在用户首次登录我们的网站并打开套接字时注册用户,然后每n秒检查一次,看看他们是否在redis中填充了新消息。如果我们找到它,我们将查询redis以获取它们的套接字ID并向它们发出消息。
我已经让注册片工作了,现在我正在使用一个对象来尝试发出一条消息,但是当我循环连接的用户时,我仍然得到相同的id,即使有两个。我认为这与nodejs是非阻塞有关,但我不确定我需要在哪里进行更改。
Redis如下所示:
hash:socket_by_user_id 12345, 45678,
服务器启动后,我有:
setInterval(function() { checkForNotifications() }, 5000);
该功能(目前)执行以下操作:
function checkForNotifications()
{
redisDB.hkeys('sockets_by_user_id', function(err, keys)
{
if (err) return report_error(err);
for (var i=0; i < keys.length; i++)
{
var user_id = keys[i];
//console.log(user_id);
redisDB.hget("sockets_by_user_id", user_id, function(err, socket_id){
if (err) return report_error(err);
console.log(user_id);
});
}
});
}
当这个运行时,我看到以下内容:
57905
57905
57905
57905
我期待看到
14175
57905
14175
57905
然后它也会得到我将要发出的正确套接字。最终我需要再次调用redis来获取要发送的实际消息,但是在我完成此部分之前这不是很有用。
答案 0 :(得分:2)
尝试此操作以保持当前user_id
的范围:
function checkForNotifications()
{
redisDB.hkeys('sockets_by_user_id', function(err, keys)
{
if (err) return report_error(err);
for (var i=0; i < keys.length; i++)
{
(function(user_id){
redisDB.hget("sockets_by_user_id", user_id, function(err, socket_id){
if (err) return report_error(err);
console.log(user_id);
});
})(keys[i]);
}
});
}