Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在redis\lua中定义函数?_Node.js_Lua_Redis_Globals - Fatal编程技术网

Node.js 如何在redis\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

我正在使用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);
 });
所以我得到了这个错误:

[错误:运行脚本时出错(调用…@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()