set_by_lua_block(等等)总是将类型转换为字符串

时间:2019-02-22 18:02:22

标签: nginx lua openresty

我有以下内容:

set_by_lua_block $tags {
    local cjson=require("cjson")
    return cjson.encode({language="english"})
}

然后在主应用中,我记录以下内容:

logger.info(asString(ngx.var.tags))
logger.info(type(ngx.var.tags)

此打印

{"language":"english"}
string

为什么将变量设置为字符串而不是表?

1 个答案:

答案 0 :(得分:0)

这里正在发生两件事:

  • 您使用cjson.encode将表编码为JSON,这将返回一个字符串
  • ngx.var仅可容纳字符串,因为nginx变量也可用于非Lua指令

如果要根据同一请求将复杂的值从一个块传送到另一个块,则ngx.ctx是您要的。

例如:

rewrite_by_lua_block {
   ngx.ctx.tags = {language="english"}
}
...
log_by_lua_block {
   ngx.log(ngx.ERR, "language: ", ngx.ctx.tags.language)
}

请注意,此处不涉及JSON转换。