我有一个使用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
在配置后直接显示,我会看到输出。
我该如何解决这个问题?
答案 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
函数的其他函数。