我正在使用Node.js和'redis-scripto'模块,我正在尝试在Lua中定义一个函数:
var redis = require("redis");
var redisClient = redis.createClient("6379","127.0.0.1");
var Scripto = require('redis-scripto');
var scriptManager = new Scripto(redisClient);
var scripts = {'add_script':'function add(i,j) return (i+j) end add(i,j)'};
scriptManager.load(scripts);
scriptManager.run('add_script', [], [1,1], function(err, result){
console.log(err || result);
});
所以我收到了这个错误:
[错误:ERR错误运行脚本(调用.... @enable_strict_lua:7:user_script:1:脚本尝试创建全局变量'add']
所以我发现它是一种保护,as explained in this thread:
“ scriptingEnableGlobalsProtection 的文档字符串表示意图是通知脚本作者常见错误(不使用本地)。”
但我还是不明白 - 这个脚本文件在哪里?改变全局表的解决方案对我来说似乎有风险。
有没有简单的方法将函数设置为redis - 使用lua?
答案 0 :(得分:4)
脚本运行器看起来像是在函数中运行代码。因此,当您创建function add()
时,它会认为您是在意外地在函数内部执行此操作。它也可能与调用add(i,j)
的参数有类似的问题。
如果这是正确的,那么这应该有效:
local function add(i,j) return (i+j) end return add(1,1)
如果THAT有效,那么希望这也可以通过js传递你的参数:
local function add(i,j) return (i+j) end return add(...)
答案 1 :(得分:2)
这对我有用:(从上面的问题改变第5行):
var scripts = {
'add_script':'local function add(i,j) return (i+j) end return(add(ARGV[1],ARGV[2]))'};
将变量传递给脚本使用KEYS []和ARGV [],如redis-scripto guide中所述 这里还有一个很好的例子:“Lua: A Guide for Redis Users”
答案 2 :(得分:2)
您必须为变量分配匿名函数(使用本地)。
local just_return_it = function(value)
return value
end
--// result contains the string "hello world"
local result = just_return_it("hello world")
或者,您可以创建表并在表上添加函数作为字段。这允许更面向对象的风格。
local obj = {}
function obj.name()
return "my name is Tom"
end
--// result contains "my name is Tom"
local result = obj.name()
Redis要求这样做是为了防止访问全局范围。整个脚本机制旨在将持久性保留在脚本层之外。允许全局范围内的事物将创建一种简单的方法来破坏它,使得在服务器上跟踪和管理状态变得更加困难。
注意:这意味着您必须为使用它们的每个脚本添加相同的功能。它们不会在服务器上持久存在。