2017-04-22 119 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文件中並使用Phoenix的渲染。

看到宏選擇命名約定使用有沒有辦法讓我在另一個模塊中強制渲染某個視圖?

我對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

酷!我用get_format函數更新了我的response_type。謝謝! –

回答

0

我想第二個問題是,我真正想做的是將許多這些模板保存在error_view.ex文件中並使用Phoenix的渲染。

關注的是,我可以直接回答你... https://hexdocs.pm/phoenix/Phoenix.Controller.html#render/4

只是解決了它,你通過查看模塊作爲第二個參數,與該視圖模塊模板,以及受讓人即你要。

關於認證插件,除非您創建它作爲研究靈藥的方式,否則我可以推薦使用Guardian。這裏有一個簡單的文章,解釋如何使用監護人爲api和phoenix html

+0

所以這就是同樣的問題,如果它的狀態是200,那麼效果很好,如果它是其他任何狀態,它將發送狀態而不是文本正文。 我對使用Guardian也不是很感興趣,但謝謝!這實際上是我學會了如何去做我已經有的東西的地方。 –

+0

只是爲了清楚地理解,你是否想回應一個代碼錯誤,並添加需要渲染的視圖,或者你想改變錯誤請求的默認視圖? – cevado

+0

它實際上正在工作,但最終成爲我前端的一個奇怪問題。 無論哪種方式,這是一個很好的建議,並且如果有人正在尋找未來的答案,它會指向別人正確的方向。 –