我为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'
很抱歉我的解释不好。
答案 0 :(得分:2)
这是redis问题
在这里
http://redis.io/commands/script-load
ret_1 = script_load(&#34;返回1&#34;)
ret_1(康涅狄格州)
1L
在您的情况下,脚本无法理解&#39; loadfile&#39;的意思。
答案 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。