Phoenix 混合任务上的 HTTPoison ArgumentError
HTTPoison ArgumentError on Phoenix mix task
我在 phoenix app (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
- 我做错了什么?
- 在混合任务中发出 http 请求的正确方法是什么?
当 应用程序及其所有依赖项 已经启动时,控制器中的代码 运行s。 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
您也可以在实际调用之前使用 HTTPoison.start()
。如果您不想每次都在混合文件中启动 hackney 应用程序或者如果您不想开始使用 Application.
我在 phoenix app (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
- 我做错了什么?
- 在混合任务中发出 http 请求的正确方法是什么?
当 应用程序及其所有依赖项 已经启动时,控制器中的代码 运行s。 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
您也可以在实际调用之前使用 HTTPoison.start()
。如果您不想每次都在混合文件中启动 hackney 应用程序或者如果您不想开始使用 Application.