【发布时间】:2020-07-10 19:25:46
【问题描述】:
当用户尝试访问不存在的 API 路由时,Phoenix 遇到了问题。 Phoenix 似乎希望在默认情况下呈现“404.html”,从而导致调用 catch all 渲染函数(返回地图),然后导致错误,因为 Phoenix 正在尝试将 JSON 呈现为 HTML。
** (UndefinedFunctionError) function Phoenix.HTML.Safe.to_iodata/1 is undefined (module Phoenix.HTML.Safe is not available)
Phoenix.HTML.Safe.to_iodata(%{error: %{errors: ["An internal error has occurred. Our team has been notified."], message: "Internal Error"}})
(phoenix) lib/phoenix/controller.ex:729: Phoenix.Controller.__put_render__/5
(phoenix) lib/phoenix/endpoint/render_errors.ex:77: Phoenix.Endpoint.RenderErrors.instrument_render_and_send/5
(phoenix) lib/phoenix/endpoint/render_errors.ex:62: Phoenix.Endpoint.RenderErrors.__catch__/5
(phoenix) lib/phoenix/endpoint/cowboy2_handler.ex:42: Phoenix.Endpoint.Cowboy2Handler.init/4
这是最终被调用的默认渲染函数:
def render(code, _assigns) do
Logger.error("Error handler requested #{inspect code}. Please add support for that.")
%{
error: %{
message: "Internal Error",
errors: ["An internal error has occurred. Out team has been notified."]
}
}
end
我在上一个问题(此处:https://stackoverflow.com/a/39189452)中看到了“set_format”解决方案,并且,正如用户所说,这确实让人觉得有点笨拙,尽管它似乎确实有效。
我也知道我可以只指定一个接受 404.html 的渲染函数,但这也比我想要的更像是一个创可贴。
我的最终目标是让 Phoenix 不想渲染 404.html,而是我想任意指定模板,或者至少告诉 Phoenix 它应该寻找 404.json。理想情况下,该解决方案将是应用范围广泛的。
【问题讨论】: