如何连接Plug.Router与插件功能

时间:2017-02-25 10:54:36

标签: elixir plug

我试图在Elixir中设置一个非常简单的基本HTTP API。我认为使用Phoenix这样的事情是完全矫枉过正的,所以想通过使用Plug来做到这一点。我可以通过设置这样的基本路由器来实现:

defmodule Example.Router do
  use Plug.Router

  plug Plug.Logger
  plug :match
  plug :dispatch

  get "/" do    
    data = do_something_with_conn(conn)

    send_resp(conn, 200, Poison.encode!(data))
  end

  match _, do: send_resp(conn, 404, "Not Found")
end

但是,我无法弄清楚如何将此路由器连接到另一个插件功能。比方说,我有这个插件兼容的功能:

defmodule RandomPlug do
  import Plug.Conn
  def random_plug(conn, opts) do
    whatever(conn)
  end
end

如何将其连接到路由器?我尝试使用docs中的语法:

forward "/", to: RandomPlug.random_plug

和其他变体,但我无法编译和/或工作。例如,上面的版本抱怨没有random_plug / 0函数。

是的,我可以使用整个Plug模块(initcall),但我想知道如何使用函数。也许它会让我更好地理解Elixir的一些细节,并且根据文档应该是可能的。

1 个答案:

答案 0 :(得分:1)

我刚刚阅读了Plug.Builder的来源,但未找到在plug中指定模块和函数名称组合的方法。它seems to be limited to either a function name or a module name(在这种情况下,它会调用module.init/2)。但是,您可以 import模块中的函数,然后将导入的函数视为本地函数:

defmodule Example.Router do
  use Plug.Router

  ...

  import RandomPlug
  plug :random_plug
end