elixir - Phoenix 混合任务上的 HTTPoison ArgumentError

标签 elixir httprequest phoenix-framework elixir-mix httpoison

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

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

当我运行 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

但在我的 Controller 中,这段代码 res = HTTPoison.get!("https://blockchain.info/ticker") 成功了!

信息:

hackney: 1.15.1
httpoison: 1.5.0
phoenix: 1.4.3
  1. 我做错了什么?
  2. 在混合任务中发出 http 请求的正确方法是什么?

最佳答案

Controller 中的代码在应用程序及其所有依赖项 已经启动时运行。 mix 任务在 :mix 应用程序中运行,默认情况下显然不会启动 :hackney

您只需确保它已启动/手动启动:

def run(_args) do
  # ⇓⇓⇓⇓⇓⇓⇓ THIS ⇓⇓⇓⇓⇓⇓⇓
  Application.ensure_all_started(:hackney)
  # ⇑⇑⇑⇑⇑⇑⇑ THIS ⇑⇑⇑⇑⇑⇑⇑

  res = HTTPoison.get!("https://blockchain.info/ticker")
  IO.inspect(res)
end

关于elixir - Phoenix 混合任务上的 HTTPoison ArgumentError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55946337/

相关文章:

postgresql - Travis CI 忽略 Postgres 版本规范

elixir - 使用 GenServer.cast 的测试代码

google-drive-api - 使用谷歌驱动器将视频流式传输到 html5 播放器

testing - 使用 IEx 调试 phoenix 测试

elixir - 处理 phoenix elixir 中的模式匹配异常

ios - iOS 上的 Safari 允许每个域同时连接多少个?

javascript - 带有 HTTP 请求的 Meteor 方法不返回回调

elixir - 在 Phoenix/Elixir 中,我应该将用户上传的文件和图像存储在哪里?

elixir - 由于遥测,我们的 Phoenix 应用程序无法启动

elixir - 如何在 Elixir 中调用 Erlang 函数