Как избежать циклической зависимости в lua без глобальных переменных? - PullRequest
0 голосов
/ 27 февраля 2019

Я использую 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

Это дает мне круговую проблему зависимости.Я видел на в другом посте SO , что вы можете использовать глобальные переменные, т. Е. Делать photoClient = photoClient or require('app.clients.photoClient'), но я не хочу использовать глобальные переменные и хочу, чтобы каждый модуль оставался для себя.

Как я могу это сделать?

1 Ответ

0 голосов
/ 27 февраля 2019

Нашли решение в документации 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

Исправлена ​​проблема. Вот ссылка на страницу книги для всех, кому интересно читать дальше.

...