【问题标题】:HTTPoison ArgumentError on Phoenix mix taskPhoenix 混合任务上的 HTTPoison ArgumentError
【发布时间】:2019-09-20 14:45:27
【问题描述】:

我在 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

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

信息:

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

【问题讨论】:

    标签: elixir httprequest phoenix-framework elixir-mix httpoison


    【解决方案1】:

    控制器中的代码在应用程序及其所有依赖项已经启动时运行。 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
    

    【讨论】:

    • 感谢您的帮助!其作品!我可以在哪里阅读有关此的更多信息以了解更多信息?
    • 关于 OTP、监督树以及 erlang 虚拟机如何工作?互联网上有大量资源。我犹豫建议有点特别,查看官方列表erlang.org/faq/obtaining.html
    【解决方案2】:

    您也可以在实际通话之前使用HTTPoison.start()。如果您不想每次都在混合文件中启动 hackney 应用程序,或者您不想开始使用 Application.

    【讨论】:

    • 当我们调用HTTPoison.start() 时会发生什么?
    • HTTPoison 是 OSS,看在上帝的份上。 github.com/edgurgel/httpoison/blob/master/lib/httpoison/…
    • @ZubairNabi 不正确。检查我上面发布的链接:它不仅需要:hackney 应用程序,而且是整个动物园。包括:httpoison 本身及其所有依赖项。好吧,依赖项是 :hackney only,但仍然如此。
    • 它实际上做了@AlekseiMatiushkin 所做的事情。启动 Httpoison 应用程序及其依赖项。
    • @AlekseiMatiushkin 明白了。是的,Httpoison.start 启动所有应用程序,但是对于用户的特定问题,他可以启动“hackney”。谢谢:+1
    猜你喜欢
    • 2017-02-23
    • 2017-09-24
    • 2017-09-18
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2015-11-13
    相关资源
    最近更新 更多