【问题标题】:Redis Lua script - how to pass array as argument to a Lua script in nodejs?Redis Lua 脚本 - 如何将数组作为参数传递给 nodejs 中的 Lua 脚本?
【发布时间】:2017-05-23 17:18:21
【问题描述】:

我正在从 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] 的值是多少?它如何获得它的价值?例如。它是一个包含逗号分隔的演员列表的字符串吗?
  • 根据redis.io/commands/eval,您应该使用ARGVKEYS 调用client.eval(script, 2, ...
  • @greatwolf, ARGV[1] 将是值数组,如 ['keyv1','keyv2']
  • 不是根据错误信息。它看到的是一个字符串,而不是一个数组。
  • 从这个issue来看,看起来js数组传入eval时会变成字符串。是否有理由不先解包数组并将它们作为单独的参数传递?

标签: arrays lua redis


【解决方案1】:

您只需使用 ARGV 即可:

local actorlist = ARGV

for i, k in ipairs(actorlist) do

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

eval "_script_" 0 arg1 arg2 argN

【讨论】:

    【解决方案2】:

    您只能将字符串传入 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语法)

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 2013-06-04
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多