如何让 Plug.ErrorHandler 和其他插件同时工作?

How do I make Plug.ErrorHandler and other Plug work at the same time?

我注意到 send_respPlug.ErrorHandlerhandle_errors 回调中生成的响应没有通过其他插件。

例如,我在 handle_error 中构建了一个 JSON 响应。但是这个 JSON 响应不会通过我的 JSONHeaderPlugCORSPlug。这带来了很多麻烦。

特定症状如缺少这些基本的 HTTP headers:

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

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

我不知道为什么会这样(我以为错误之前的所有插件都会应用,但我确实重现了你的情况)。您仍然可以将所有插件放在一个模块中并自己调用它。请记住,您应该在 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