我有如下的nginx配置文件:
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
init_by_lua 'cjson = require("cjson")';
server {
listen 8080;
location / {
default_type text/html;
content_by_lua '
json_text = "{ \"aaa\": \"bar\" }"
local message = cjson.decode(json_text)
ngx.say(message)
';
}
}
}
当我访问URL http://localhost:8080时,出现错误:
content_by_lua(nginx.conf:17): in main chunk, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:8080"
2019/11/25 15:03:12 [error] 36979#684497: *2 lua entry thread aborted: runtime error: content_by_lua(nginx.conf:17):2: attempt to call global 'aaa' (a nil value)
它抱怨调用全局'aaa',但我正在做的只是解码json字符串。我在脚本中犯了什么错误吗?
请不要使用content_by_lua
;甚至手册也告诉您使用content_by_lua_block
。您的问题很可能是由于错误地引用了字符串引起的;可能是因为nginx已经解释了\
,而Lua却获得了未转义的"
。
此外,如果您要在字符串内使用引号,最好保持安全并使用[[
和]]
甚至在其中扔一些=
。
content_by_lua_block {
json_text = [[{ "aaa": "bar" }]]
local message = cjson.decode(json_text)
-- Equivalent to:
-- local message = {aaa = "bar"}
ngx.say(message)
}
您的代码无论如何都不会起作用,因为cjson.decode
返回一个表,ngx.say
将不打印该表(它仅打印字符串和数组),因此您将不会获得任何输出。例如,您可以打印message.aaa
,它将向用户打印bar。