2016-06-23 5 views
0

Я пытаюсь переместить старый метод LUA, который загружал содержимое JSON из файла в глобальную переменную в «класс». Но я получаю следующие ошибки все время:LUA load Конфигурация JSON из файла

attempt to call field 'decode' (a nil value) 
attempt to index global 'cjson' (a nil value) 

Я не знаю, Lua хорошо, но я пробовал почти все комбинации без результата, так вы можете объяснить, почему происходит эта ошибка?

Текущая реализация модуля выглядит следующим образом:

Config = {} 
Config.__index = Config 

function Config.create(config_filename) 
    local cjson = require("cjson") 
    local config = {}    
    setmetatable(config,Config) 

    local f = io.open(config_filename, "r") 
    local content = f:read("*a") 
    f:close() 
    config = cjson.decode(content) 

    return config 
end 

return Config 

В окончательном результате я хочу, чтобы выполнить что-то вроде этого из другого файла:

local config_class = require("config") 
local config = config_class.create("/path/to/file.json") 

ngx.say(config:some_configuration_data()) 

ответ

1

Поскольку сообщение об ошибке говорит вам cjson и расшифровывает равны нулю значения, которые не могут быть проиндексированы или вызваны.

require загрузит файл и запустит код и передаст возвращаемое значение. Если вы запускаете сценарий Lua, он работает как функция, которая возвращает nil по умолчанию. Поэтому, если вы не укажете, что возвращает скрипт require, он вернет nil.

Я не знаю, что находится внутри вашего файла cjson, который вам нужен, но он явно не возвращает желаемую реализацию json, но nil.

Таким образом, код в cjson должен возвращать таблицу Lua с функцией, хранящейся под ключом «decode».

+0

И как я могу заставить заставить загружать правильную реализацию «cjson»? – SZMER

+0

Хорошо, я испортил путь загрузки. Кажется, что он работает после исправлений пути загрузки. Благодарю. – SZMER