Node.js 如何在redis\lua中定义函数?
我正在使用Node.js和“redis scripto”模块,并试图在Lua中定义一个函数:Node.js 如何在redis\lua中定义函数?,node.js,lua,redis,globals,Node.js,Lua,Redis,Globals,我正在使用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 = {'ad
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);
});
所以我得到了这个错误:
[错误:运行脚本时出错(调用…@enable\u strict\u lua:7:user\u脚本:1:script试图创建全局变量'add']
所以我发现这是一种保护
“ScriptingEnableGlobalProtection的文档字符串表示意图是通知脚本作者常见错误(不使用本地错误)。”
但是我仍然不明白-这个脚本在哪里?而且改变全局表的解决方案对我来说似乎有风险
没有简单的方法可以使用lua将函数设置为redis吗?看起来脚本运行程序正在函数中运行您的代码。因此,当您创建
function add()
时,它会认为您是在函数中意外地执行此操作。它还可能在调用add(i,j)
的参数方面存在类似的问题。
如果这是正确的,那么这应该起作用:
local function add(i,j) return (i+j) end return add(1,1)
如果这是可行的,那么希望通过js传递的参数也能做到:
local function add(i,j) return (i+j) end return add(...)
这对我很有效:(将上述问题的第5行改为):
要将变量传递给脚本,请使用键[]和ARGV[],如中所述
这里还有一个很好的例子:“您必须为变量分配一个匿名函数(使用局部变量) 或者,您可以创建一个表,并在表上添加函数作为字段。这允许更面向对象的样式
local obj = {}
function obj.name()
return "my name is Tom"
end
--// result contains "my name is Tom"
local result = obj.name()
Redis需要这一点来阻止对全局范围的访问。整个脚本机制旨在将持久性排除在脚本层之外。允许全局范围内的内容将创建一种简单的方法来破坏这一点,从而使跟踪和管理服务器上的状态变得更加困难
注意:这意味着您必须将相同的函数添加到每个使用它们的脚本中。它们在服务器上不是持久的
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()