Unterschiedliche Fehler für unterschiedliche Pipelines rendern (: api und: browser)?
In meinem aktuellen Phoenix-Projekt habe ich sowohl eine :browser
Pipeline als auch eine :api
Pipeline. Ich möchte für jede Pipeline unterschiedliche Fehlermeldungen rendern. Ich bin mir jedoch nicht sicher, wie ich es erreichen soll.
Mein router.ex
ist wie:
scope "/api", AppWeb do
pipe_through(:api)
# ...
end
scope "/admin", AppWeb do
pipe_through :browser
# ...
end
Ich möchte, dass alle Anforderungen an nicht vorhandene Routen unter /admin
eine HTTP-Fehlervorlage rendern, aber alle Anforderungen an eine andere Route, um eine JSON-Fehlervorlage zu rendern.
In config.exs
habe ich
render_errors: [view: AppWeb.ErrorView, accepts: ~w(json html)]
Ich bin mir jedoch nicht sicher, wie ich mit der Fehleransicht fortfahren soll.
Es scheint, dass die template_not_found/2
Funktion automatisch aufgerufen wird, wenn ein Routing-Fehler auftritt. Diese Funktion hat jedoch kein conn
Argument. Ihre Argumente sind template
und assigns
.
Sollte ich versuchen, die zu überprüfen assigns
, um festzustellen, auf welche Route die eingehende Anforderung zugreifen wollte? Der Versuch, die Vorlage zu überprüfen, schien nicht hilfreich zu sein, und die Vorlage, die versucht wurde, gerendert zu werden, scheint mit einer .html
Erweiterung zu enden , selbst wenn ich versuche, eine Route unter zu besuchen /api
.
Wie @ JoséValim betonte, habe ich JSON-Fehlermeldungen nicht richtig gesehen, weil ich die Seiten über einen Browser besucht habe. Wenn ich den Header Accept: application/json
in meiner Anfrage richtig gesetzt habe, hat es funktioniert.
In der template_not_found
Funktion in error_view.ex
scheint es zu genügen, nur zu schreiben Phoenix.Controller.status_message_from_template(template)
.