Javascript 使用node_redis客户端正确执行Lua脚本

Javascript 使用node_redis客户端正确执行Lua脚本,javascript,node.js,lua,redis,Javascript,Node.js,Lua,Redis,我试图编写一个非常简单的Lua脚本,从node_redis访问redis中的hyperloglog功能。我有1个键和多个散列作为要传递的元素。只有将键和参数硬编码如下,我才能成功完成此操作: 脚本: '返回redis.call('pfadd'、'testkey'、'valvalval')' 虽然这很好地工作,但这不是很有用 我已经尝试了所有可能的方法来访问密钥和ARGV数组,这就是我目前在.js文件中的内容: var script = '\ local val = 0 \ for _, hash

我试图编写一个非常简单的Lua脚本,从node_redis访问redis中的hyperloglog功能。我有1个键和多个散列作为要传递的元素。只有将键和参数硬编码如下,我才能成功完成此操作:

脚本: '返回redis.call('pfadd'、'testkey'、'valvalval')'

虽然这很好地工作,但这不是很有用

我已经尝试了所有可能的方法来访问密钥和ARGV数组,这就是我目前在.js文件中的内容:

var script = '\
local val = 0 \
for _, hash in pairs(ARGV) do \
     redis.call("pfadd", KEYS[1], hash) \
end \
return val';
调用我的脚本:

redisInstance.eval(script, 1, args, function (ret) {
    console.log(ret);
});
args是一个数组,如下所示:

['key','hash1','hash2','hash3', ...,'hash30']
回调始终为空,并且服务器上未设置任何键。。。未访问密钥和ARGV数组。。。(如我所说,当硬编码时,它工作良好.)

我需要将所有散列作为元素传递(每次总共大约30个)并接收整数回复


提前感谢您的帮助。

我正在回答我自己的问题,这是aembke的评论。。。谢谢你的帮助

var script =  
'\
local val = 0 \
for _,hash in pairs(ARGV) do \
  val = tonumber(redis.call("pfadd", KEYS[1], hash)) \
end \
return val';
呼叫评估:

redisInstance.eval(args, function(err, res){
    //use res
})
args数组:

[script, "#keys" ("1" in this case), ['key string'], ['hash1', ...., 'hash30']]   

前面的答案是错误的,您需要将所有参数和值合并到单个数组(使用lodash进行采样):


无论如何,你应该考虑它支持Lua ScIrPTS的抽象。< /P>什么是“1”?在redisInstance.eval(script,1,args,function(ret){…})中,有两个快速跳出的东西:回调接受两个参数,error和result,而不仅仅是result。另外,试着像这样调用它:redisInstance.eval([script,1,['key'],['hash1',hash2']],function(error,resp){…})1指定键的数量。
var keys = _.keys(filteredData);
var values = _.values(filteredData); 
var command = ["function code",keys.length];
command = command.concat(keys,values);