0

我正在尝试在 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

但是,我不知道如何将此路由器连接到另一个 Plug 功能。说,在某个地方我有这个插件兼容的功能:

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

如何将它连接到路由器?我尝试使用文档中的这种语法:

forward "/", to: RandomPlug.random_plug

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

是的,我可以让它与整个 Plug 模块(使用initand call)一起工作,但我想弄清楚如何让它与一个函数一起工作。也许它会让我更好地理解 Elixir 的一些细节,根据文档应该是可能的。

4

1 回答 1

1

我只是阅读了源代码,Plug.Builder并没有找到在plug. 它似乎仅限于函数名称或模块名称(在这种情况下它将调用module.init/2)。但是,您可以 import从模块中获取函数,然后将导入的函数视为本地函数:

defmodule Example.Router do
  use Plug.Router

  ...

  import RandomPlug
  plug :random_plug
end
于 2017-02-25T11:16:21.917 回答