2017-07-21 4 views
0

J'ai une application Phoenix qui utilise Phoenix.Token pour signer et vérifier des jetons.Erreur lors de l'utilisation de `Phoenix.Token` dans une tâche de mélange

Cela fonctionne très bien dans l'application elle-même, mais je reçois une erreur étrange lorsque vous essayez d'utiliser Phoenix.Token à partir d'une tâche de mixage.

Voici un exemple minimal:

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 

Quand je lance cette tâche, je vois:

** (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 

Cela semble impliquer que je ne l'ai pas configuré :secret_key_base, mais ce n'est pas vrai; c'est dans config.exs, et si je IO.puts directement après la configuration, je vois cette sortie.

Comment résoudre ce problème?

Répondre

3

Démarrer l'App

Michał Muskala ont répondu à cette question pour moi dans la Slack Elixir. Il a dit:

Le tableau ets ne démarre pas, parce que le point final ne démarre pas

erreurs d'argument ets sont assez ennuyeux :(

Une solution, comme il l'a fait remarquer, est de démarrer l'application comme ceci:

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

la tâche devient:

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 

Avec l'application démarrée, la tâche peut appeler d'autres fonctions qui dépendent des fonctions Phoenix.Token.