2017-04-22 2 views
1

그래서 일부 오류 처리 및 사용자가 응답을 보내도록 인증되지 않은 경우 플러그를 만들려고합니다. 그래서send_resp에서 데이터를 가져 오는 데 문제가 발생했습니다.

def unauthorized(conn) do 
    respond(conn, response_type(conn), 401, "Unauthorized") 
end 

defp response_type(conn) do 
    accept = accept_header(conn) 
    if Regex.match?(~r/json/, accept) do 
     :json 
    else 
     :html 
    end 
end 

defp accept_header(conn) do 
    value = conn 
     |> get_req_header("accept") 
     |> List.first 

    value || "" 
end 

defp respond(conn, :json, status, msg) do 
    try do 
     conn 
     |> put_resp_content_type("application/json") 
     |> send_resp(status, Poison.encode!(%{errors: msg})) 
     |> IO.inspect 
     |> halt 
    rescue ArgumentError -> 
     conn 
     |> put_resp_content_type("application/json") 
     |> send_resp(status, Poison.encode!(%{errors: [msg]})) 
     |> halt 
    end 
end 

거의 노력하는

상태를보고있다 검사 : 여기 내 코드입니다 : 전송, 상태 : 전송에 401

하지만, 전송 결코 내 에러 메시지.

두 번째 질문은 error_view.ex 파일에 많은 템플릿을 저장하고 피닉스의 렌더링을 사용하고 싶습니다.

매크로가 을 사용하여 명명 규칙을 선택하면을 사용하여 다른 모듈에서 특정 뷰의 렌더링을 강제로 수행 할 수있는 방법이 있습니까?

저는 Elixir에 상당히 익숙해졌습니다. 도움에 감사드립니다!

편집 :

그래서 나는 put_view을 발견하지만 그 일을 내가 200

이외의 오류 코드가있을 때 내가 어떤 오류 코드를한다면, 그것은 보이지 않는 보이지 않는다 메시지를 다시 보내려면이 플러그 만 사용해야합니다. 내가 put_status을 다른 컨트롤러에서 사용한다면 완전히 정상적으로 작동하지만 여기서는 작동하지 않습니다. 그것이 실패합니다 아무것도 인 경우에,

defp respond(conn, :json, status, msg) do 
    try do 
     conn 
     |> put_resp_content_type("application/json") 
     #|> send_resp(status, Poison.encode!(%{errors: msg})) 
     |> put_status(status) 
     |> put_view(ChatApp.Web.UsersView) 
     |> render("error_user_creation.json", string: msg) 
     |> IO.inspect 
     |> halt 
    rescue ArgumentError -> 
     conn 
     |> put_resp_content_type("application/json") 
     |> send_resp(status, Poison.encode!(%{errors: [msg]})) 
     |> halt 
    end 
end 

그것은 그러나 나는 오랫동안이 (200)의 상태의로를 통해 전송하고 올바른 몸을 보내는 :

여기에 새로운 코드입니다.

편집, 편집 :

내 코드는 200 상태 코드가 완벽하게 합리적으로 실행되지만 다른 뭔가를 넣어 때, 그것은 나누기 :

그것은 다음과 같이 호출되는 것 :

case Accounts.check_token(List.first(token)) do 
     {:ok, user} -> 
      conn 
      |>GeneralUtils.put_private(:user, user) 
      |> AuthResponses.unauthorized 
     :error -> 
      conn 
      |> GeneralUtils.put_private(:error, {:error, "You do not have permissions"}) 
    end 

또한이 AuthResponses.unauthorized가 오류 상태 여야 함을 알고 있습니다. 현재 테스트 중이며 더 쉽습니다.

+2

요청 형식을 얻기위한'Phoenix.Controller.get_format/1' 함수가 있습니다. (수락 플러그는 conn에 당신을 위해 형식을 넣을 것입니다) – sysashi

+0

쿨! 내 response_type을 get_format 함수로 업데이트했습니다. 감사! –

답변

0

두 번째 질문은 error_view.ex 파일에 많은 템플릿을 저장하고 피닉스의 렌더링을 사용하고 싶습니다. 그 중심으로

, 난 당신이 두 번째 인수, 그보기 모듈 관련 템플릿 및 양수인으로보기 모듈을 통과 https://hexdocs.pm/phoenix/Phoenix.Controller.html#render/4

단지 그것을 해결 ... 직접 대답 할 수 네가 원해.

인증을위한 플러그에 관해서, 당신이 엘릭서를 배우는 방법이 아니라면 Guardian을 추천 할 수 있습니다.여기에 api과 phoenix에 보호자를 사용하는 방법을 설명하는 html

+0

그래서 똑같은 문제입니다. 200이라는 상태라면 상태가 좋지만 텍스트 본문이 아닌 다른 상태라면 상태가 좋습니다. Guardian을 사용하는 데 정말로 관심이 없지만 감사합니다! 그것은 실제로 내가 이미 가지고있는 것을하는 법을 배웠던 곳입니다. –

+0

명확하게 이해하려면 코드 오류로 응답하고 렌더링해야하는 뷰를 추가하거나 잘못된 요청에 대한 기본 뷰를 변경 하시겠습니까? – cevado

+0

실제로 작동하지만 프런트 엔드에서 이상한 문제가 발생했습니다. 어느 쪽이든 좋은 제안이었고 누군가가 미래에 이것에 대한 답을 찾고 있다면 올바른 방향으로 누군가를 가리킬 것입니다. –

관련 문제