2017-02-25 15 views
0

私はElixirで非常に簡単な基本的なHTTP APIを設定しようとしています。私はPhoenixを使ってこのようなことをするのは残念だと思っていたので、プラグを使って簡単にやりたいと思っていました。そして、私はこのような基本的なルータを設定することによってそれを行うことができます。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 

しかし、私は別のプラグイン関数にこのルータを接続する方法を見つけ出すことはできません。こういったプラグ対応機能があるとします。

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

ルータに接続するにはどうすればいいですか?

forward "/", to: RandomPlug.random_plug 

そして、他のバリエーションを、私はそれがコンパイルおよび/または動作させることはできません:私はdocsからこの構文を使用してみました。例えば、上記のバージョンでは、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 
関連する問題