2015-04-13 5 views
5

Der folgende Code weitgehend auf das Beispiel hier basiert:Elixir - Einfache Plug Beispiel trifft die Call-Methode zweimal auf jede Anforderung

http://hexdocs.pm/plug/

Der einzige wirkliche Unterschied ist die Zugabe eines Betreuers:

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 

Hier ist der Stecker selbst:

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 

Wenn ich die Anwendung mit iex -S mix auszuführen, öffnen Sie einen Browser, schlagen dann localhost, die IEX-Prompt IO.puts 'Log Antwort' zweimal für jede HTTP-Anfrage ...

Was ist Ursachen Das?

Antwort

5

Nach dem Testen vor Ort denke ich, die erste Anfrage ist für ein Favicon. Sie können sehen, dass, wenn Sie hinzufügen - es ["favicon.ico"] ausgeben wird.

Sie können ganz einfach Matching auf dem Pfad hinzufügen, etwa so:

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 

Beachten Sie, dass die [] den / Weg darstellt.