2017-11-03 7 views
0

API 끝점을 구현 중입니다. 내 컨트롤러 액션에서,이 같은 경비를 사용 PARAM 유형을 확인하고 싶습니다 :구조 작업 원인 오류 오류

def get_object(conn, %{"objectId" => object_id}) when is_binary(object_id) do 

때 클라이언트 통화 상태가 "OBJECTID는"바이너리없는이 엔드 포인트, 또는 모두에서 "OBJECTID"없이, 피닉스 올리는 Phoenix.ActionClauseError. 이러한 예외를 구하고 사용자 지정 응답 본문 (예 : {"message": "Invalid request body"})을 반환하고 싶습니다. 이것을 어떻게 할 수 있습니까? 나는 Plug.ErrorHandler을 사용해 보았지만 오류를 다시 제기하고 있습니다 (문서로 작성).

편집 : 나는 유사한 문제 (https://github.com/phoenixframework/phoenix/issues/2386)를 발견하지만 난 그들

답변

1

의 많은있을 것입니다 당신이에 대한 기본 절을 구현 관련하여 무엇을 발견, 각 컨트롤러 액션에 대한 def get_object(conn, _params), do: :params_mismatch을 만들려면 않을 것 명시 적이며 추론하기 쉽고 명시된 바와 같이 기본적으로 각 동작에 대한 코드의 한 줄인 모든 동작에 대해 각 동작이 최상의 방법입니다. ,

defaction get_object(conn, %{"objectId" => object_id}) do 
    ... 
end 

이 같은 매크로의 구현은 내가 권하고 싶습니다 것이 아니라, 재미와 게임 :

당신은 같이 보일 수있는 보일러를 제거하기 위해 매크로를 사용할 수 있습니다 간단한 구현과 같이 보일 수 있습니다 :

defmacro defaction(signature, do: body) do 
    {name, argc} = 
    case signature do 
     {:when, _, [{name, _, args} | _]} -> 
     {name, length(args)} 
     {name, _, args} -> 
     {name, length(args)} 
    end 
    argv = Enum.map(1..argc, fn _ -> quote do _ end end) 
    quote location: :keep do 
    def unquote(signature) do 
     unquote(body) 
    end 
    def unquote(name)(unquote_splicing(argv)) do 
     :params_mismatch 
    end 
    end 
end 
당신은 다음과 같이 작업을 정의 할 수

:

defaction get_object(conn, %{"objectId" => object_id}) do 
    ... 
end 

또는 : 나는 매크로 정의를 보면 볼 수있는 오류 처리를 가린다뿐만 아니라 더 어려워 코드에 대한 지역의 추론을 할 수 있기 때문에,이 방법에 대해 당신을주의 할

defaction get_object(conn, %{"objectId" => object_id}) when is_binary(object_id) do 
    ... 
end 

.