为什么我在使用嵌套的redis语句时出错

时间:2017-08-10 13:05:45

标签: node.js redis

我是redis的新手,我一直在研究一些例子,每当我在节点js中使用嵌套的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没有采用回复的值?

1 个答案:

答案 0 :(得分: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客户端连接。