Redis Lua脚本 - 如何在nodejs中将数组作为参数传递给Lua脚本?

7
我将从nodejs调用Lua脚本。我希望将一个数组作为参数传递。我在解析Lua中的该数组时遇到了问题。
以下是一个示例:
var script = 'local actorlist = ARGV[1] 
if #actorlist > 0 then
for i, k in ipairs(actorlist) do
   redis.call("ZADD","key", 1, k)
end
end';

client.eval(
     script, //lua source
     0,
     ['keyv1','keyv2']
     function(err, result) {
         console.log(err+'------------'+result);
     }
    );

我收到了这个错误:

"ERR 运行脚本出错(调用 f_b263a24560e4252cf018189a4c46c40ce7d1b21a):@user_script:1: user_script:1: 'ipairs' 的第 1 个参数应该是表格类型,但传入了字符串类型"


ARGV[1] 应该是什么值?它是如何获得它的值的?例如,它是一个包含逗号分隔的演员列表的字符串吗? - greatwolf
根据https://redis.io/commands/eval的指示,你应该使用`ARGV`或`KEYS`并用`client.eval(script, 2, ...`进行调用。 - greatwolf
@greatwolf,ARGV [1] 将是类似['keyv1','keyv2']的值数组。 - Suyog Kale
不是根据错误信息。它看到的是一个字符串,而不是一个数组。 - greatwolf
从这个问题来看,似乎当传入eval时,js数组会变成字符串。不拆开数组先传递它们作为单独的参数有什么原因吗? - greatwolf
2个回答

3
你可以通过使用ARGV来完成这个操作:
local actorlist = ARGV

for i, k in ipairs(actorlist) do

并在控制台中像这样传递参数:

eval "_script_" 0 arg1 arg2 argN

-1

在 Redis 的 Lua 脚本中,你只能传入字符串。

如果你需要将一个值数组传递到 Redis 的 Lua 脚本中,可以这样做:

let script = `
if #ARVG > 0 then
    for i, k in ipairs(ARGV) do
       redis.call("ZADD","key", 1, k)
    end
end`;

client.eval(
     script, //lua source
     0,
     ...['keyv1','keyv2'],
     function(err, result) {
         console.log(err+'------------'+result);
     }
);

关键在于在调用eval时将keyv1keyv2作为单独的参数传递。(这里我使用es6语法)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接