如何在redis \ lua中定义函数?

时间:2014-01-21 10:08:40

标签: 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 = {'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?

3 个答案:

答案 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要求这样做是为了防止访问全局范围。整个脚本机制旨在将持久性保留在脚本层之外。允许全局范围内的事物将创建一种简单的方法来破坏它,使得在服务器上跟踪和管理状态变得更加困难。

注意:这意味着您必须为使用它们的每个脚本添加相同的功能。它们不会在服务器上持久存在。