2015-04-13 26 views
5

Poniższy kod jest oparta w dużej mierze na przykład znaleźć tutaj:Elixir - Prosty przykład Wtyczka uderza metodę połączenia dwa razy na każde żądanie

http://hexdocs.pm/plug/

Jedyną różnicą jest dodanie przełożonego:

defmodule MyApi.Supervisor do 
    use Supervisor 

    def start_link do 
     Supervisor.start_link(__MODULE__, :ok) 
    end 

    def init(:ok) do 
     children = [ 
      Plug.Adapters.Cowboy.child_spec(
       :http, MyApi.BasicServer, [], [ port: 80 ] 
      ) 
     ] 

     supervise(children, strategy: :one_for_one) 
    end 
end 

Oto wtyczka sama:

defmodule MyApi.BasicServer do 
    import Plug.Conn 
    import Process 

    def init(options) do 
     IO.puts("Log Init") 
     options 
    end 

    def call(conn, _opts) do 
     IO.puts("Log Response") 

     conn 
      |> put_resp_content_type("text/plain") 
      |> send_resp(200, "Hello world") 
    end 
end 

Kiedy uruchomić aplikację z iex -S mieszanki otwórz przeglądarkę, a następnie uderzył localhost Z iex wierszu IO.puts 'Log Response' dwa razy dla każdego żądania HTTP ...

Co powoduje, że?

Odpowiedz

5

Po testach lokalnych myślę, że pierwsze żądanie dotyczy favikona. Możesz zobaczyć, że jeśli dodasz IO.inspect(conn.path_info) - wyświetli się ["favicon.ico"].

Można łatwo dodać dopasowanie na ścieżce tak:

def call(conn = %{path_info: []}, _opts) do 
    conn 
    |> put_resp_content_type("text/plain") 
    |> send_resp(200, "Hello world") 
end 

def call(conn, _) do 
    conn 
    |> put_resp_content_type("text/plain") 
    |> send_resp(404, "Not found") 
end 

Należy pamiętać, że [] reprezentuje ścieżkę /.