set_by_lua_block (и так далее) всегда конвертирует тип в строку - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть следующее:

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 голосов
/ 23 февраля 2019

Здесь происходят две вещи:

  • Вы кодируете таблицу как JSON с cjson.encode, это возвращает строку
  • 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.

...