从另一个lua脚本加载lua脚本

时间:2016-09-13 09:52:34

标签: node.js lua redis eval lua-table

我为node.js项目编写了一些lua脚本。但是我的一些lua脚本中有相同的代码。让我先解释一下。

我的第一个脚本从redis返回给定键的所有数据。

script1.lua

local data = {};
local keyslist = redis.call('keys', 'day:*');
local key, redisData;
for iCtr = 1, #keyslist do
    key = string.gsub(keyslist[iCtr], 'day:','');

    redisData = redis.call('hmget', keyslist[iCtr], 'users');
    table.insert(data, {date=key, users=redisData[1]});
end
return cjson.encode(data);

我的第二个脚本从redis返回同一个键中的前2个记录。

script2.lua

local data = {};
local keyslist = redis.call('keys', 'day:*');
local key, redisData;
for iCtr = 1, #keyslist do
    if iCtr < 3  
        key = string.gsub(keyslist[iCtr], 'day:','');

        redisData = redis.call('hmget', keyslist[iCtr], 'users');
        table.insert(data, {date=key, users=redisData[1]});
    end    
end
return cjson.encode(data);

现在想从script2.lua调用script1.lua,如下所示。

script2.lua(想要如下)

local file = assert(loadfile("script1.lua"));
return file(2)  -- return only top 2 records where needed.
                -- some forLoop logic will be change as per about need.

我曾尝试过以上代码,但是通过以下错误

Script attempted to access unexisting global variable 'loadfile'

很抱歉我的解释不好。

3 个答案:

答案 0 :(得分:2)

这是redis问题

看看: https://redislabs.com/ebook/redis-in-action/part-3-next-steps-3/chapter-11-scripting-redis-with-lua/11-1-adding-functionality-without-writing-c/11-1-1-loading-lua-scripts-into-redis

在这里

http://redis.io/commands/script-load

  

ret_1 = script_load(&#34;返回1&#34;)

     

ret_1(康涅狄格州)

     

1L

在您的情况下,脚本无法理解&#39; loadfile&#39;的意思。

或尝试此项目https://github.com/anvaka/redis-load-scripts

答案 1 :(得分:1)

要么使用 dofile("filename.lua") 运行文件,要么使用 loadstring(stringOfCode) 获取字符串的函数。示例:

code = "print('hello from string')"
fnc = loadstring(code)
fnc()

或简而言之:

loadstring("print('hello from string')")()

这将打印:hello from string

答案 2 :(得分:0)

使用dofile(文件名)。 并按如下所示重组第二个lua文件:

file2_function = function()
code
code
code
code
return blah,blub
end

然后只需按如下所示调用全局变量file2_function:

等等,blub = file2_function()

此解决方案的唯一丑陋之处是您创建了一个全局变量:file2_function。