2017-08-10 59 views
0

我是redis的新手,我一直在通过一些示例,每当iam在节点js中使用嵌套的redis语句时iam出现错误。 我有以下代码:为什么我在使用嵌套的redis语句时出现错误

var redis= require("redis");           
client = redis.createClient();    
client.on('connect',function(err){ 
if(err) console.log("not able to connect"); 
console.log("connected");});      
client.RPUSH("pony","new"); 
client.RPUSH("pony","val");         
client.LINDEX("pony",-1,function(err,reply){ 
if(err) console.log("oops"); 
console.log(reply); 
client.LREM("pony",-1,reply,function(err,rep){ 
    if(err) console.log("error"); 
    else console.log(rep); 
});})               
client.quit(); 

我得到的输出

连接, VAL, 错误

这里从LINDEX的回复是一个字符串 “VAL” 这我将它传递给LREM。

为什么嵌套的client.lrem没有收到回复的值?

回答

0

你的代码没问题。但client.quit()得到您的client.LREM("pony",-1,reply,function(err,rep){ if(err) console.log(err); else console.log(rep); });

可以执行之前执行,您收到错误

{ [AbortError: Stream connection ended and command aborted. It might have been processed.] code: 'NR_CLOSED', command: 'LREM', args: [ 'pony', -1, 'val' ] }

client.quit()执行

client.LINDEX("pony",-1,function(err,reply){ 
if(err) console.log("oops"); 
console.log("##" + reply); 

client.LREM()需要更多的时间后立即执行,并因为它执行在JavaScript事件队列变空之后(这就是javascript的工作原理)。

所以,我建议你可以使用承诺(如“Q”)或async.series()以串行方式执行代码,并确保如果所有的操作都完全执行,然后关闭Redis的客户端连接。

或者另一个简单的选项是不关闭redis客户端连接。

+0

谢谢我想通了:)我叫client.quit();在client.lindex语句内,它工作正常 – nuy5

相关问题