我注意到send_resp
的{{1}}回调中handle_errors
产生的响应没有通过其他插件。
例如,我在Plug.ErrorHandler
中构建了一个JSON响应。但是此JSON响应不会传递我的handle_error
和JSONHeaderPlug
。这带来了很多麻烦。
具体症状,例如缺少以下基本HTTP标头:
CORSPlug
有没有办法让access-control-allow-credentials: true
access-control-allow-origin: *
access-control-expose-headers:
content-type: application/json; charset=utf-8
中的响应以与正常响应相同的顺序通过其他插头?
答案 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