Phoenix mix 任务上的 HTTPoison ArgumentError

Mea*_*bot 2 elixir-mix elixir httprequest phoenix-framework httpoison

mix fetch.btc在 phoenix 应用程序上有混合任务(lib/mix/tasks/fetch.btc.ex):

defmodule Mix.Tasks.Fetch.Btc do
  use Mix.Task

  def run(_args) do
    res = HTTPoison.get!("https://blockchain.info/ticker")
    IO.inspect(res)
  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行时mix fetch.btc出现错误:

** (ArgumentError) argument error
    (stdlib) :ets.lookup_element(:hackney_config, :mod_metrics, 2)
    PROJ_DIR/deps/hackney/src/hackney_metrics.erl:27: :hackney_metrics.get_engine/0
    PROJ_DIR/deps/hackney/src/hackney_connect.erl:78: :hackney_connect.create_connection/5
    PROJ_DIR/deps/hackney/src/hackney_connect.erl:47: :hackney_connect.connect/5
    PROJ_DIR/deps/hackney/src/hackney.erl:330: :hackney.request/5
    lib/httpoison/base.ex:787: HTTPoison.Base.request/6
    lib/httpoison.ex:128: HTTPoison.request!/5
    lib/mix/tasks/fetch.btc.ex:14: Mix.Tasks.Fetch.Btc.run/1
    (mix) lib/mix/task.ex:331: Mix.Task.run_task/3
    (mix) lib/mix/cli.ex:79: Mix.CLI.run_task/2
    (elixir) lib/code.ex:767: Code.require_file/2
Run Code Online (Sandbox Code Playgroud)

但在我的控制器中,这段代码res = HTTPoison.get!("https://blockchain.info/ticker")工作成功!

信息:

hackney: 1.15.1
httpoison: 1.5.0
phoenix: 1.4.3
Run Code Online (Sandbox Code Playgroud)
  1. 我究竟做错了什么?
  2. 在 mix 任务中发出 http 请求的正确方法是什么?

Ale*_*kin 5

当应用程序及其所有\xe2\x80\x99s 依赖项已启动时,控制器中的代码就会运行。mix任务在应用程序内运行:mix,显然默认情况下不会启动:hackney

\n\n

您所需要做的就是确保它\xe2\x80\x99s 已启动/手动启动它:

\n\n\n\n
def run(_args) do\n  # \xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93 THIS \xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\n  Application.ensure_all_started(:hackney)\n  # \xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\xe2\x87\x91 THIS \xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\xe2\x87\x91\n\n  res = HTTPoison.get!("https://blockchain.info/ticker")\n  IO.inspect(res)\nend\n
Run Code Online (Sandbox Code Playgroud)\n