set_by_lua_block (以及类似的函数) 总是将类型转换为字符串

我有以下代码:

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

为什么这个变量被设置为字符串而不是表格?

点赞
用户2328533
用户2328533

这里发生了两件事情:

  • 使用 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 转换。

2019-02-22 21:15:28