【问题标题】:How do I make Plug.ErrorHandler and other Plug work at the same time?如何让 Plug.ErrorHandler 和其他 Plug 同时工作?
【发布时间】:2019-03-16 22:02:51
【问题描述】:

我注意到send_respPlug.ErrorHandlerhandle_errors回调中产生的响应并没有通过其他Plugs。

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

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

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

有没有办法让handle_error中的响应按照正常响应的顺序通过其他Plugs?

【问题讨论】:

    标签: elixir phoenix-framework plug


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 2018-06-17
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      相关资源
      最近更新 更多