2017-02-25 3 views
0

J'essaie de configurer une API HTTP très simple et de base dans Elixir. Je pensais que l'utilisation de Phoenix pour une telle chose est totalement exagérée, alors je voulais le faire simplement en utilisant Plug. Et je peux le faire en créant un routeur de base comme celui-ci:Comment connecter Plug.Router avec la fonction 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 

Cependant, je ne peux pas comprendre comment connecter le routeur à une autre fonction plug. Dis, quelque part j'ai cette fonction compatible avec la prise:

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

Comment le connecter au routeur? Je l'ai essayé d'utiliser cette syntaxe du docs:

forward "/", to: RandomPlug.random_plug 

et d'autres variations, mais je ne peux pas l'obtenir pour compiler et/ou au travail. Par exemple, la version ci-dessus se plaint de l'absence de fonction random_plug/0. Oui, je peux le faire fonctionner avec un module Plug complet (avec init et call), mais je veux comprendre comment le faire fonctionner avec une fonction. Peut-être que cela me permettra de mieux comprendre certaines spécificités d'Elixir, et cela devrait être possible selon les docs.

Répondre

1

Je viens de lire la source de Plug.Builder et n'a pas trouvé un moyen de spécifier une combinaison de nom de module et de fonction dans plug. Il seems to be limited to either a function name or a module name (dans ce cas, il va appeler module.init/2). Mais, vous pouvez import les fonctions du module, puis traiter les fonctions importées comme des fonctions locales:

defmodule Example.Router do 
    use Plug.Router 

    ... 

    import RandomPlug 
    plug :random_plug 
end