1

我注意到send_resphandle_errors回调中生成的响应Plug.ErrorHandler不会通过其他插件。

例如,我在handle_error. 但是这个 JSON 响应不会通过我的JSONHeaderPlugand CORSPlug。这带来了很多麻烦。

具体症状,例如缺少这些基本的 HTTP 标头:

access-control-allow-credentials: true
access-control-allow-origin: *
access-control-expose-headers: 
content-type: application/json; charset=utf-8

有没有办法让响应以handle_error与正常响应相同的顺序通过其他插件?

4

1 回答 1

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
于 2019-03-11T13:47:09.507 回答