Node.js redis hget在代码段中返回null,但在redis cli中工作 for(i=0;i
上面是我的代码片段。redis cli hget命令返回正确的答案,确认哈希设置正确,键和字段/值正确。但是,上面的代码片段为hget返回“null”(convID具有正确的值,该值是hget的字段)-我不明白为什么-Node.js redis hget在代码段中返回null,但在redis cli中工作 for(i=0;i,node.js,redis,node-redis,Node.js,Redis,Node Redis,上面是我的代码片段。redis cli hget命令返回正确的答案,确认哈希设置正确,键和字段/值正确。但是,上面的代码片段为hget返回“null”(convID具有正确的值,该值是hget的字段)-我不明白为什么-convID在redisclient.lindex回调返回之前不会被设置。在for循环长期退出之前不会发生这种情况(因为节点的事件循环在退出循环之前都不会运行)。您正在向redisclient发出一大堆异步请求,而不是等待它们中的任何一个返回 对我来说,确切地告诉您想要做什么有点困
convID
在redisclient.lindex
回调返回之前不会被设置。在for
循环长期退出之前不会发生这种情况(因为节点的事件循环在退出循环之前都不会运行)。您正在向redisclient
发出一大堆异步请求,而不是等待它们中的任何一个返回
对我来说,确切地告诉您想要做什么有点困难,但您可能希望了解控制库的流,比如异步
可以定义一个布尔标志变量(适用于您的模块或启动循环的任何函数)这将由您的第一次成功回调设置,并告诉后续回调忽略其结果。但我只是猜测。主要问题是您试图在异步环境中使用同步控制流。问题不在于Redis,而在于您对node.js asynchronous programmi的理解Redis客户端库是异步的(就像大多数node.js库一样)。不能像同步一样使用它 hget命令在Redis有机会发送lindex命令的结果之前发送。convID变量未设置为您期望的时间。for循环在处理任何结果之前退出 您应该将依赖于convID的所有代码放在lindex的回调中,并且在处理完所有结果之后,您可能需要在最后调用一个额外的回调
请参见上的一个示例,感谢您的回复,它起到了作用,我现在更明白了,非常感谢。
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);
});