如何在lua nginx中解码json字符串?

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

我有如下的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字符串。我在脚本中犯了什么错误吗?

nginx lua
1个回答
0
投票

请不要使用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

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