从系统环境加载端点配置

时间:2018-09-25 12:59:57

标签: environment-variables elixir runtime config phoenix-framework

我在lib/flashcards_web/endpoint.ex中具有以下端点初始化:

  @doc """
  Callback invoked for dynamically configuring the endpoint.

  It receives the endpoint configuration and checks if
  configuration should be loaded from the system environment.
  """
  def init(_key, config) do
    if config[:load_from_system_env] do
      port = System.get_env("PORT") || raise "expected the PORT environment variable to be set"                                                      
      jwt_token_ttl_minutes =
        "USER_SESSION_MINUTES"
        |> System.get_env
        |> String.to_integer
      || raise "expected the USER_SESSION_MINUTES environment variable to be set"                                                                    

      config =
        config
        |> Keyword.put(:http, [:inet6, port: port])
        |> Keyword.put(:jwt_token_ttl_minutes, jwt_token_ttl_minutes)

      {:ok, config}
    else
      {:ok, config}
    end
  end

以及load_from_system_env: true中必填的config/dev.exs行:

# For development, we disable any cache and enable
# debugging and code reloading.
#
# The watchers configuration can be used to run external
# watchers to your application. For example, we use it
# with brunch.io to recompile .js and .css sources.
config :flashcards, FlashcardsWeb.Endpoint,
  http: [port: 4000],
  debug_errors: true,
  code_reloader: true,
  check_origin: false,
  watchers: [node: ["node_modules/brunch/bin/brunch", "watch", "--stdin",
                    cd: Path.expand("../assets", __DIR__)]],
  load_from_system_env: true

但是在运行时

PORT=4000 USER_SESSION_MINUTES=1 iex -S mix phx.server

我得到:

iex(1)> Application.get_env(:flashcards, FlashcardsWeb.Endpoint)[:jwt_token_ttl_minutes]
nil

我在这里想念东西吗?

1 个答案:

答案 0 :(得分:1)

找到了访问动态端点配置的解决方案。

文档提到一个config/2 function is automatically generated at the endpoint

因此,可以按以下方式访问动态端点配置:

iex(2)> FlashcardsWeb.Endpoint.config(:jwt_token_ttl_minutes)
1