如何避免没有全局变量的lua中的循环依赖?

时间:2019-02-27 04:27:30

标签: lua openresty

我正在使用OpenResty,并且我的应用设置为:

app/
   clients/
      photoClient.lua
   init.lua
   auth.lua

假设photoClient同时具有未经身份验证的端点和经过身份验证的端点(类似于无需登录即可访问的头像端点,但可能需要首先登录私人照片)

因此,关于依赖项,我有:

-- auth.lua

local photoClient = require('app.clients.photoClient')
-- this is used to show avatar on the login page

local auth = {}

auth.isAuthenticated = function ()
   -- logic to check authentication
end

return auth

客户是

-- photoClient.lua
local auth = require('app.auth')

local photoClient = {}
photoClient.privateEndpoint = function()
   if (!auth.isAuthenticated()) {
       ngx.exit(403)
   }
   ...
end

photoClient.getAvator = function() {
   -- this is a public method used by auth
}

return photoClient

这给了我一个循环依赖问题。我在other SO post上看到可以使用全局变量,即执行photoClient = photoClient or require('app.clients.photoClient'),但我不想使用全局变量,并且不想让每个模块都局限于自身。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

在凯特·亚当斯(Kate Adams)的LuaFlare文档中找到了解决方案:在对每个文件进行package.loaded[...] = your_module之前,基本上先添加return your_module,即

-- auth.lua
local auth = {}
package.loaded[...] = auth

local photoClient = require('app.clients.photoClient')

...

return auth


-- photoClient.lua
local photoClient = {}
package.loaded[...] = photoClient

local auth = require('app.auth')

...

return photoClient

解决了问题。 Here is the link到该书的页面供有兴趣阅读更多内容的人使用。