2017-02-25 72 views
0

我正在尝试在Elixir中设置一个非常简单的基本HTTP API。我认为使用凤凰这种东西完全是过火,所以想用Plug来简单地做。我可以通过设置这样的基本路由器来实现:如何将Plug.Router连接到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 

如何将它连接到路由器?我已经使用这个语法从docs尝试:

forward "/", to: RandomPlug.random_plug 

和其他变化,但我不能得到它来编译和/或工作。例如上面的版本抱怨没有random_plug/0函数。

是的,我可以得到它与整个插件模块(带initcall)工作,但我想弄清楚如何获得它的功能工作。也许它会让我更好地理解一些药剂的细节,根据文档它应该是可能的。

回答

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