我正在尝试将旧的LUA方法移动到“class”中,该方法将一些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())
答案 0 :(得分:1)
由于错误消息告诉你cjson和decode是无法索引或调用的nil值。
nil
将加载一些文件并运行包含的代码并传递返回值。如果您运行Lua脚本,它的行为就像一个默认返回require
的函数。因此,除非您指定脚本返回的内容nil
将返回nil
。
我不知道你需要的cjson文件里面有什么,但它显然不会返回想要的json实现,而是end
。
因此cjson中的代码应该返回一个Lua表,其中的函数存储在键“decode”下。