基于redis返回获取循环中的数组值

时间:2015-06-22 20:39:23

标签: node.js

使用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来获取要发送的实际消息,但是在我完成此部分之前这不是很有用。

1 个答案:

答案 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]);
        }
    });
}