2017-09-11 2 views
1

Comment retourner une table/tableau d'une directive set_by_lua_* afin qu'elle puisse être lue plus tard par une autre directive set_by_lua_*?Comment configurer la variable nginx en table/tableau Lua

Mon intention est de retourner une valeur complexe une fois, puis de mettre des morceaux de la valeur retournée dans d'autres variables. Dans un monde idéal ce que je voudrais écrire (exemple non travail):

location { 
    set_by_lua_file $info '/my/library/do_stuff_with_headers_and_env.lua'; 

    set_by_lua $language 'return $info["language"]'; 
    set_by_lua $best_server 'return $info["server"]'; 
    set_by_lua $last_user 'return $info["user"]'; 

    echo "Best server for $language is $best_server (last used by $last_user)"; 
} 

On pourrait simplement définir ces variables dans le script en utilisant ngx.var, mais je voudrais écrire le fichier de script comme une sorte de bibliothèque et laissez l'utilisateur extraire uniquement les informations dont il a besoin.

Étant donné que set_by_lua_* ne supporte pas les tables/tableaux (set_by_lua $x 'return {"foo", "bar"}'; ensembles $x à nil), sont là les meilleures pratiques, des solutions de contournement ou des moyens idiomatiques pour retourner une table/tableau à partir set_by_lua_* directives?

Répondre

1

Il y a deux façons de le faire

Définir les variables première et valeur définie dans le script

location/{ 
    set_by_lua $language ''; 
    set_by_lua $best_server ''; 
    set_by_lua $last_user ''; 

    set_by_lua_file $info '/my/library/do_stuff_with_headers_and_env.lua'; 


    echo "Best server for $language is $best_server (last used by $last_user)"; 
} 

Dans votre do_stuff_with_headers_and_env.lua vous avez ci-dessous

local info = {language ="english"} 
ngx.var.language = info["language"] 

Définition de variables sous forme codée

location/{ 
    set_by_lua $info ' 
     local cjson=require("cjson") 
     return cjson.encode({language="english"}) 
     '; 

    set_by_lua $language ' 
     local cjson=require("cjson") 
     return cjson.decode(ngx.var.info)["language"]; 
     '; 

    echo "Best server for $language"; 
}