redis hget在代码段中返回null但在redis-cli中有效

时间:2012-06-10 08:53:43

标签: node.js redis node-redis

for (i=0 ; i < pri.state.totalConversations; i++) {
            redisclient.lindex("conversationsIDList",i, function(err,reply) { 
            convID = reply;
            console.log("ConvID: " + "i: " + i + " "+  convID);         
});
          if(convID == pri.state.lastUpdatedConversationID)
            break;
            redisclient.hget("conversations", convID, function(err,reply) {
            console.log("ConvID hget: "+ convID + " "+ reply);
                data = JSON.parse(reply);
                console.log("data: " +data);

            });
上面的

是我的代码片段。 redis-cli hget命令返回正确的答案,确认我使用正确的键和字段/值正确设置了哈希值。但是,上面的代码片段为hget返回“null”,(convID具有正确的值,这是hget的字段) - 我不明白为什么 -

2 个答案:

答案 0 :(得分:1)

在您的convID回调返回之前,

redisclient.lindex不会被设置。在你的for循环早已退出之前就不会发生这种情况(因为节点的事件循环在你离开循环之前甚至不会运行)。你正在向redisclient发出一大堆异步请求,而不是等待其中任何一个回来。

我很难确切地说出你想做什么,但是你可能想要研究像Async这样的控制流库。

可能可以定义一个布尔标志变量(作用于您的模块或任何启动循环的函数),该变量将由您的第一个成功回调设置,并告诉后续回调忽略其结果。但我只是在猜测。主要问题是您尝试在异步环境中使用同步控制流。

答案 1 :(得分:1)

问题不在于Redis,而在于您对node.js异步编程的理解。 Redis客户端库是异步的(与大多数node.js库一样)。你不能像使用同步一样使用它。

在Redis有机会发送lindex命令的结果之前发送hget命令。在您期望的时候,convID变量未设置为您期望的值。在可以处理任何结果之前退出for循环。

你应该在lindex的回调中根据convID放置所有代码,并且你可能需要一个额外的回调函数,以便在处理完所有结果时调用它。

请参阅For loop get items from redis delay

上的示例