LoginSignup
4

More than 5 years have passed since last update.

Plug.ErrorHandlerとPlug.DebuggerでPhoenixの標準のエラーをカスタマイズする

Last updated at Posted at 2018-12-16

この記事は「Elixir Advent Calendar 2018」の16日目です

1年弱PhoenixでAPIサーバーを書いてきた中で得た、Phoenixが標準で返すエラーレンスポンスについての知見をご紹介します

前提

この記事での「標準のエラー」は、Phoenixが勝手にハンドリングしてくれる種のエラーとします。ルーティング未定義や文法ミスで怒られてる時に出るものです。
(最適な表現があれば教えてください🙇‍♂️)

エラー時のレスポンスのカスタマイズ

例えばルーティング未定義のパスにアクセスした際、デフォルトだとそれぞれのバージョンで以下のようなレスポンスが返ります(MIX_ENV=devだとデバッグ画面が出ます)

Phoenix1.4
"Not Found"

# phx.newの際に '--no-html --no-webpack' を付けた場合
# (吐き出される lib/views/error_view.ex が変わる)
{"errors":{"detail":"Not Found"}}
Phoenix1.3以下
"Page not found"

ここの形式を丸ごと上書きしたかったりする場合は以下のように Plug.ErrorHandler.handle_errors を自分で書いてRouter内でuseします

lib/hoge_web/router_err_handler.ex
defmodule HogeWeb.RouterErrHandler do
  @moduledoc ""

  defmacro __using__(_) do
    quote do
      use Plug.ErrorHandler

      def handle_errors(conn, %{reason: %Phoenix.Router.NoRouteError{}}) do
        conn
        |> put_status(404)
        |> json(%{message: "Not Found"})
      end

      def handle_errors(conn, _) do
        conn
        |> put_status(500)
        |> json(%{message: "Internal Server Error"})
      end

    end
  end
end
lib/hoge_web/router.ex
defmodule HogeWeb.Router do
  use HogeWeb, :router
  use HogeWeb.RouterErrHandler
  # ...

しかし、これらは MIX_ENV=dev の時のデバッグ画面も上書きすることに注意してください

デバッグ画面をかっこよくしてみる

あまりにも使いどころがありませんが、MIX_ENV=devの際のデバッグ画面をカスタマイズする方法が一応用意されています

こんな感じ

(名取さなちゃんチック)
1544951627635.jpg

Plug.Debuggerで出来ます

lib/hoge_web/endpoint.ex

defmodule HogeWeb.Endpoint do
  use Phoenix.Endpoint, otp_app: :hoge

  if Mix.env == :dev do
    use Plug.Debugger,
      otp_app: :hoge,
      style: [primary: "#eb9dc7", accent: "#eb9dc7", logo: "data:image/png;base64,..."]
  end
  # ...

:style以外にもこの画面に入ってきた値を受け取ってごにょごにょする関数を渡せたりします(:banner)

詳しくはこちらを https://hexdocs.pm/plug/Plug.Debugger.html

まとめ

Plug.Debugger、公式doc以外に記事が無かった...
2018はPhoenixやcowboyで業務を行なってきましたが、2019もお世話になります🙇‍♂️

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4