Визуализировать разные ошибки для разных конвейеров (: api и: browser)? - PullRequest
4 голосов
/ 28 июня 2019

В моем текущем проекте Phoenix у меня есть и :browser конвейер, и :api конвейер.Я хочу сделать разные сообщения об ошибках для каждого конвейера.Однако я не уверен, как этого добиться.

Мой router.ex похож на:

  scope "/api", AppWeb do
    pipe_through(:api)
    # ...
  end

  scope "/admin", AppWeb do
    pipe_through :browser
    # ...
  end

Я хочу, чтобы все запросы к несуществующим маршрутам в /admin отображалиШаблон ошибки HTTP, но все запросы на любой другой маршрут для отображения шаблона ошибки JSON.

В config.exs У меня есть

render_errors: [view: AppWeb.ErrorView, accepts: ~w(json html)]

Однако яне уверен, как поступить с представлением ошибок.

Похоже, что функция template_not_found/2 будет вызываться автоматически при возникновении ошибки маршрутизации, однако эта функция не имеет аргумента conn.Его аргументы: template и assigns.

Должен ли я попытаться проверить assigns, чтобы попытаться определить, к какому маршруту поступал входящий запрос?Попытка осмотреть шаблон не показалась мне полезной, и попытка визуализации шаблона, похоже, заканчивается расширением .html, даже если я пытаюсь посетить маршрут в /api.

1 Ответ

2 голосов
/ 29 июня 2019

Как отметил @ JoséValim, причина, по которой я не правильно вижу сообщения об ошибках JSON, заключается в том, что я посещал страницы через браузер. Если я правильно установил заголовок Accept: application/json в моем запросе, это сработало.

В template_not_found функции в error_view.ex, кажется, достаточно просто написать Phoenix.Controller.status_message_from_template(template).

...