如何让 Plug.ErrorHandler 和其他插件同时工作?
How do I make Plug.ErrorHandler and other Plug work at the same time?
我注意到 send_resp
在 Plug.ErrorHandler
的 handle_errors
回调中生成的响应没有通过其他插件。
例如,我在 handle_error
中构建了一个 JSON 响应。但是这个 JSON 响应不会通过我的 JSONHeaderPlug
和 CORSPlug
。这带来了很多麻烦。
特定症状如缺少这些基本的 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
我注意到 send_resp
在 Plug.ErrorHandler
的 handle_errors
回调中生成的响应没有通过其他插件。
例如,我在 handle_error
中构建了一个 JSON 响应。但是这个 JSON 响应不会通过我的 JSONHeaderPlug
和 CORSPlug
。这带来了很多麻烦。
特定症状如缺少这些基本的 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