HTTPoison ArgumentError в микшере Phoenix - PullRequest
1 голос
/ 02 мая 2019

У меня есть смешанная задача 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

Когда я запускаю 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-запрос в смешанной задаче?

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Код в вашем контроллере запускается, когда приложение и все его зависимости уже запущены. 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
1 голос
/ 02 мая 2019

Вы также можете использовать HTTPoison.start() перед фактическим вызовом.Это также будет работать, если вы не хотите запускать приложение hackney каждый раз в файле микса или если вы не хотите начинать использовать приложение.

...