2017-08-10 29 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

相關問題