2017-04-22 121 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

它实际上正在工作,但最终成为我前端的一个奇怪问题。 无论哪种方式,这是一个很好的建议,并且如果有人正在寻找未来的答案,它会指向别人正确的方向。 –