如何使Plug.ErrorHandler和其他Plug-in同时工作?

时间:2019-03-11 08:24:20

标签: elixir phoenix-framework plug

我注意到send_resp的{​​{1}}回调中handle_errors产生的响应没有通过其他插件。

例如,我在Plug.ErrorHandler中构建了一个JSON响应。但是此JSON响应不会传递我的handle_errorJSONHeaderPlug。这带来了很多麻烦。

具体症状,例如缺少以下基本HTTP标头:

CORSPlug

有没有办法让access-control-allow-credentials: true access-control-allow-origin: * access-control-expose-headers: content-type: application/json; charset=utf-8 中的响应以与正常响应相同的顺序通过其他插头?

1 个答案:

答案 0 :(得分:1)

我不知道为什么会这样(我认为错误会被应用,但是我确实重现了您的情况)。您仍然可以将所有插头放在模块中并自己调用。请记住,您应该在handle_errors回调中做尽可能少的操作,因为其中一个插件可能是导致错误的原因。

defmodule ApplySomePlug do
  use Plug.Builder

  plug(CORSPlug)
  plug(:put_custom_header)

  def put_custom_header(conn, _) do
    Plug.Conn.put_resp_header(conn, "foo", "bar")
  end
end

并使用它

def handle_errors(conn, _) do
  opts = ApplySomePlug.init(nil)
  conn = ApplySomePlug.call(conn, opts)

  Phoenix.Controller.json(conn, %{error: "something bad happened"})
end