2017-05-17 2 views
0

J'ai de la difficulté à obtenir un exemple simple pour travailler. Je ne suis pas en utilisant Phoenix FWIW, il suffit de brancherComment fonctionne Plug.Exception?

defmodule Unauthorized do 
    defexception message: "not authorized", plug_status: 401 
end 

defmodule Foo do 
    use Plug.Router 
    plug :match 
    plug :dispatch 

    get "/" do 
    send_resp(conn, 200, "heyyyo") 
    end 

    get "/boom" do 
    raise Unauthorized 
    end 

    match _ do 
    send_resp(conn, 404, "not found") 
    end 
end 

Ce type est un exemple stupide, mais je suis juste essayer de voir si cela va fonctionner comme je pense qu'il est censé fonctionner.

J'espérais que la fiche traiterait l'exception soulevée dans GET /boom et retourner un 401 état

Cependant, quand j'essaie de GET /boom il retourne un statut 500, donc apparemment l'exception n'est pas assurée par branchez

Répondre

2

vous devez ajouter use Plug.ErrorHandler si vous voulez capturer ces exceptions et d'envoyer un code d'état HTTP basé sur l'exception qui a été soulevée:

defmodule Foo do 
    use Plug.Router 
    use Plug.ErrorHandler 

    ... 
end 

Avec ce chan ge, j'obtiens la bonne réponse:

$ curl -i http://localhost:4000/boom 
HTTP/1.1 401 Unauthorized 
server: Cowboy 
date: Wed, 17 May 2017 19:59:57 GMT 
content-length: 20 
cache-control: max-age=0, private, must-revalidate 

Something went wrong 
+0

Sweet! Merci!!!!! – luk3thomas

+0

une question de suivi pour vous. Comment puis-je tester cela? Dans le test, je peux seulement voir qu'il soulève l'exception. Je ne suis pas en mesure d'affirmer sur 'conn.status' – luk3thomas

+1

Vous pouvez utiliser' Plug.Test.sent_resp'. Exemple tiré des tests de Plug: https://github.com/elixir-lang/plug/blob/master/test/plug/error_handler_test.exs#L36-L67. – Dogbert