我有一个Phoenix应用程序,它使用Phoenix.Token对令牌进行签名和验证。
这在应用程序本身中运行良好,但在尝试从混合任务中使用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,我会看到该输出。
我该如何解决这个问题?
发布于 2017-07-22 03:50:17
启动应用程序
MichałMuskała在《万金油松弛》中为我回答了这个问题。他说:
未启动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函数的其他函数。
https://stackoverflow.com/questions/45245678
复制相似问题