読者です 読者をやめる 読者になる 読者になる

【Go】Echoで404ページと500ページを表示

Echoを使っていてデフォルトのままで存在しないURLにアクセスするとNotFoundのJSONがレスポンスとして返される。
今回はAPIでなくてサイトを作りたかったのでHTMLを返したかった。

ちょっとやり方がわからなかったので今回は以下のように対応した。

Echoで定義されているHTTPErrorHandlerを上書きすることでハンドリングできたのでここでHTTPステータスをみてテンプレートを切り替えるように対応してみた

server.go

package main

import (
  "io"
  "strconv"
  "errors"
  "net/http"
  "html/template"

  "github.com/labstack/echo"
)

var NotFoundError = errors.New("NotFound")

type Template struct {
  templates *template.Template
}

func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
  return t.templates.ExecuteTemplate(w, name, data)
}

func main() {

  t := &Template{
    templates: template.Must(template.ParseGlob("public/views/*.html")),
  }

  e := echo.New()
  e.Use(middleware.Recover())

  e.Renderer = t

  e.HTTPErrorHandler = func(err error, c echo.Context) {
    if he, ok := err.(*echo.HTTPError); ok {
      if he.Code == 404 {
        c.Render(http.StatusNotFound,"404",nil)
      } else {
        c.Render(http.StatusInternalServerError,"500",nil)
      }
    }
  }

  ・・・

}

404エラーと500エラーのテンプレートを準備

views/404.html

{{define "404"}}
  Not Found
{{end}}

views/500.html

{{define "500"}}
  Server Error
{{end}}

こんなやり方がいいのか不明です。。。以上です