尝试在Mix任务中使用`Phoenix.Token`时出错

时间:2017-07-21 19:50:17

标签: elixir phoenix-framework mix

我有一个使用Phoenix.Token来签署和验证令牌的Phoenix应用程序。

这在应用程序本身中运行良好,但在尝试使用Mix任务中的Phoenix.Token时出现了一个奇怪的错误。

这是一个最小的例子:

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在配置后直接显示,我会看到输出。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

启动应用

MichałMuskała在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函数的其他函数。