set_by_lua_block(和相似)总是将类型转换为字符串

问题描述 投票:0回答:1

我有以下内容:

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

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

nginx lua openresty
1个回答
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转换。

© www.soinside.com 2019 - 2024. All rights reserved.