Как сделать так, чтобы Plug.ErrorHandler и другие Plug работали одновременно? - PullRequest
1 голос
/ 11 марта 2019

Я заметил, что ответ, генерируемый send_resp в handle_errors обратном вызове Plug.ErrorHandler, не проходит через другие Plugs.

Например, я строю ответ JSON в handle_error. Но этот ответ JSON не пройдет мои JSONHeaderPlug и CORSPlug. Это принесло много неприятностей.

Специфические симптомы, такие как отсутствие этих основных заголовков HTTP:

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

Есть ли способ позволить ответу в handle_error проходить через другие заглушки в том же порядке, что и нормальный ответ?

1 Ответ

1 голос
/ 11 марта 2019

Я не знаю, почему это так (я думал, что все заглушки до того, как ошибка будет применена, но я воспроизвел вашу ситуацию). Тем не менее, вы можете поместить все заглушки в модуль и назвать его самостоятельно. Помните, что вы должны делать как можно меньше в обратном вызове 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
...