我是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没有采用回复的值?
答案 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客户端连接。