2017-02-25 64 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