为什么是Lua+;Nginx说它不能调用全局函数?

为什么是Lua+;Nginx说它不能调用全局函数?,nginx,lua,Nginx,Lua,我有两个简单的函数,可以基于用户代理检测浏览器和操作系统,它们存储在文件useragent.lua中 function detect_browser_platform(user_agent) -- Here goes some string matching and similar stuff return browser_platform end function detect_os_platform(user_agent) -- Here goes some str

我有两个简单的函数,可以基于用户代理检测浏览器和操作系统,它们存储在文件
useragent.lua

function detect_browser_platform(user_agent)
    -- Here goes some string matching and similar stuff
    return browser_platform
end

function detect_os_platform(user_agent)
    -- Here goes some string matching and similar stuff
    return os_platform
end

function detect_env_pattern(user_agent)
    return detect_operating_system_platform(user_agent) .. "-" .. detect_browser_platform(user_agent) .. "-" .. ngx.var.geoip2_data_country_code
end
在虚拟主机配置文件中,有一行代码表示当请求看起来像执行lua脚本时:
/var/www/default/test.lua

test.lua
中,我有以下代码:

local posix = require('posix')
local redis = require('redis')
require('useragent')

-- Some code goes here

local user_agent = ngx.req.get_headers()['User-Agent']
local pattern_string = detect_env_pattern(user_agent)

ngx.say(pattern_string)
ngx.exit(200)
但是由于某种原因,当我重新加载nginx
nginx-s reload
时,这些代码只在第一次工作。当我发出另一个请求时,它会显示以下错误:

2016/09/19 12:30:08 [error] 19201#0: *125956 lua entry thread aborted: runtime error: /var/www/default/test.lua:199: attempt to call global 'detect_env_pattern' (a nil value)
我不知道这里发生了什么。我刚开始用Lua编程,没有时间深入理解语言。。。那么我为什么会出现这个错误呢?

用表格将其包装起来:

local M={};



function detect_browser_platform(user_agent)
    -- Here goes some string matching and similar stuff
    return browser_platform
end

function detect_os_platform(user_agent)
    -- Here goes some string matching and similar stuff
    return os_platform
end

function detect_env_pattern(user_agent)
    return detect_operating_system_platform(user_agent) .. "-" .. detect_browser_platform(user_agent) .. "-" .. ngx.var.geoip2_data_country_code
end

M.detect_env_pattern = detect_env_pattern
return M
在base
lua
文件中:

  local useragent = require('useragent')
    --.....
    local user_agent = ngx.req.get_headers()['User-Agent']
local pattern_string = useragent.detect_env_pattern(user_agent)

ngx.say(pattern_string)
ngx.exit(200)
用一张桌子把它包起来:

local M={};



function detect_browser_platform(user_agent)
    -- Here goes some string matching and similar stuff
    return browser_platform
end

function detect_os_platform(user_agent)
    -- Here goes some string matching and similar stuff
    return os_platform
end

function detect_env_pattern(user_agent)
    return detect_operating_system_platform(user_agent) .. "-" .. detect_browser_platform(user_agent) .. "-" .. ngx.var.geoip2_data_country_code
end

M.detect_env_pattern = detect_env_pattern
return M
在base
lua
文件中:

  local useragent = require('useragent')
    --.....
    local user_agent = ngx.req.get_headers()['User-Agent']
local pattern_string = useragent.detect_env_pattern(user_agent)

ngx.say(pattern_string)
ngx.exit(200)