如何从set_by_lua_*
指令返回一个表/数组,以便稍后可以通过另一个set_by_lua_*
指令读取它?
我的意图是返回一次复数值,然后将返回值的部分放在其他变量中。在理想世界中,这就是我要写的(非工作示例):
location {
set_by_lua_file $info '/my/library/do_stuff_with_headers_and_env.lua';
set_by_lua $language 'return $info["language"]';
set_by_lua $best_server 'return $info["server"]';
set_by_lua $last_user 'return $info["user"]';
echo "Best server for $language is $best_server (last used by $last_user)";
}
可以使用ngx.var
在脚本中设置这些变量,但我想将脚本文件编写为一种库,让用户只提取他们需要的信息。
鉴于set_by_lua_*
不支持表/数组(set_by_lua $x 'return {"foo", "bar"}';
将$x
设置为nil
),是否有最佳实践,变通方法或惯用方法返回来自set_by_lua_*
指令的表/数组?
答案 0 :(得分:1)
有两种方法可以做到这一点
首先定义变量并在脚本中设置值
location / {
set_by_lua $language '';
set_by_lua $best_server '';
set_by_lua $last_user '';
set_by_lua_file $info '/my/library/do_stuff_with_headers_and_env.lua';
echo "Best server for $language is $best_server (last used by $last_user)";
}
在do_stuff_with_headers_and_env.lua
中,您将拥有以下
local info = {language ="english"}
ngx.var.language = info["language"]
以编码形式定义变量
location / {
set_by_lua $info '
local cjson=require("cjson")
return cjson.encode({language="english"})
';
set_by_lua $language '
local cjson=require("cjson")
return cjson.decode(ngx.var.info)["language"];
';
echo "Best server for $language";
}