Ошибка при попытке использовать Phoenix.Token в задаче Mix.

У меня есть приложение Phoenix, которое использует Phoenix.Token для подписи и проверки токенов.

Это прекрасно работает в самом приложении, но я получаю странную ошибку при попытке использовать Phoenix.Token из задачи Mix.

Вот минимальный пример:

defmodule Mix.Tasks.SignSomething do
  use Mix.Task
  alias MyApp.Endpoint

  @shortdoc "sign something"

  def run(_args) do
    IO.inspect Phoenix.Token.sign(Endpoint, "key", "val")
  end
end

Когда я запускаю эту задачу, я вижу:

** (ArgumentError) argument error
    (stdlib) :ets.lookup(MyApp.Endpoint, :secret_key_base)
    lib/phoenix/endpoint.ex:505: Mealthy.Web.Endpoint.config/2
    (phoenix) lib/phoenix/token.ex:201: Phoenix.Token.get_endpoint_key_base/1

Похоже, это означает, что я не настроил :secret_key_base, но это не так; это в config.exs, и если я IO.puts сразу после его настройки, я вижу этот вывод.

Как я могу это исправить?


person Nathan Long    schedule 21.07.2017    source источник


Ответы (1)


Запустите приложение

Михал Мускала ответил мне на этот вопрос в Elixir Slack. Он сказал:

Таблица ets не запущена, потому что конечная точка не запущена

ошибки аргумента ets довольно раздражают :(

Одно из решений, как он указал, состоит в том, чтобы запустить приложение следующим образом:

Mix.Task.run("app.start")

Итак, задача становится:

defmodule Mix.Tasks.SignSomething do
  use Mix.Task
  alias MyApp.Endpoint

  @shortdoc "sign something"

  def run(_args) do
    Mix.Task.run("app.start") # added this
    IO.inspect Phoenix.Token.sign(Endpoint, "key", "val")
  end
end

Когда приложение запущено, задача может вызывать другие функции, зависящие от Phoenix.Token функций.

person Nathan Long    schedule 21.07.2017