为不同的管道呈现不同的错误(:api和:browser)?

时间:2019-06-28 09:17:32

标签: api http elixir phoenix-framework

在我目前的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参数。其参数为templateassigns

我应该尝试检查assigns以确定传入请求试图访问的路由吗?尝试检查模板似乎无济于事,即使我尝试访问.html下的路线,尝试渲染所有模板的操作似乎都以/api扩展名结尾。

1 个答案:

答案 0 :(得分:2)

正如@JoséValim指出的那样,我没有正确看到JSON错误消息的原因是因为我正在通过浏览器访问页面。如果我在请求中正确设置了标题Accept: application/json,它就可以工作。

template_not_found的{​​{1}}函数中,只需编写error_view.ex就足够了。