2014-01-21 1 views
3

Я использую Node.js, и 'Redis-Scripto' модуль, и я пытаюсь определить функцию в Lua:Как определить функции в redis 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); 
}); 

поэтому я получаю эту ошибку:

[Error: ERR Error running script (call to .... @enable_strict_lua:7: user_script:1: Script attempted to create global variable 'add']

, так что я нашел, что это защита, as explained in this thread:

«Док-строка scriptingEnableGlobalsProtection указывает, что намерение состоит в том, чтобы уведомить авторов сценария о распространенной ошибке (не используя локальный).»

но я до сих пор не понял - где этот скриптинг.c? и решение меняющихся глобальных таблиц представляется мне рискованным.

Нет ли простого способа настройки функций для redis - с помощью lua?

ответ

2

Это работает для меня: (изменение линии 5 из приведенного выше вопроса):

var scripts = { 
'add_script':'local function add(i,j) return (i+j) end return(add(ARGV[1],ARGV[2]))'}; 

для передачи переменных КЛЮЧИ использования сценария [] и ARGV [], как объяснено в redis-scripto guide а также есть хороший пример: «Lua: A Guide for Redis Users»

4

Похоже, что бегун сценария запускает ваш код в функции. Поэтому, когда вы создаете function add(), он думает, что вы делаете это внутри функции случайно. Это также, вероятно, будет иметь аналогичную проблему с аргументами для вызова add(i,j). Если это правильно, то это должно работать:

local function add(i,j) return (i+j) end return add(1,1) 

и если это работает, то, надеюсь, это будет тоже с вашими аргументами, переданных из ЯШ:

local function add(i,j) return (i+j) end return add(...) 
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 требует этого, чтобы предотвратить доступ к глобальному охвату. Весь скриптовый механизм предназначен для сохранения устойчивости на уровне сценариев. Разрешение объектов в глобальном масштабе создаст простой способ подорвать это, что значительно затруднит отслеживание и управление состоянием на сервере.

Примечание: это означает, что вам нужно будет добавить те же функции для каждого скрипта, который их использует. Они не настойчивы на сервере.