PIYO - Tech & Life -

ブログ用のOGPサーバーが500を返すせいでHugoのビルドがこけてた

Hugo Go

この土日、定期的に動かしているブログのビルドが失敗するようになりました。調べてみるとブログのリンクカードみたいなのを作るために自前のサーバーにOGPを取りに行く際、とあるリンク先のドメインが見つからずに500エラーで返って来ていることが原因でした。ドメインの有効期限が切れたか何かだと思われます。

ちなみにリンクカードやサーバーについてはこのへんとか、

Hugoでブログリンクの見た目をはてなブログっぽくする - PIYO - Tech & Life -
これまでHeartRails Captureを使ってきたブログ内リンクを自前の実装とショートコードに置き換えました。 以前使っていたはてなブログのリンクの表示形式が気に入っていたので、それをリスペクトする

このへんとかに、書いてあります。

ブログのビルド用にOGPの情報をJSONで返すサーバーも作った - PIYO - Tech & Life -
前回の続きです。 Hugoでブログリンクの見た目をはてなブログっぽくする - PIYO - Tech & Life - これまでHeartRails Captureを使ってきたブログ内リンクを自前の実装とショートコードに置き換えました。 以

というわけでサーバー側のコードを修正しました。エラーで失敗したときに400番台、500番台を返すとビルドが止まるようだったので、OGPの取得に失敗したとしても200を返すようにしました。

対応前

og, err := opengraph.Fetch(url)
if err != nil {
	return ctx.String(http.StatusInternalServerError, fmt.Sprintf("Error: %s", err.Error()))
}

対応後

og, err := opengraph.Fetch(url)
if err != nil {
	m := map[string]string{"error": fmt.Sprintf("Error: %s", err.Error())}
	return ctx.JSON(http.StatusOK, m)
}

元々はFetchでエラーが返ってきたときは500エラーで文字列を返していたのを、200でエラーのJSONを返すように変更。そして、Hugo側のHTML(というかテンプレート)でerrorの有り無しで分岐をすることに。

{{- $json := getJSON .Site.Params.OgpJsonBaseUrl $url -}}
{{- $error := $json.error -}}
{{ if eq $error  nil }}
  元々のHTML
{{ else }}
  <a href="{{ $url }}" target="_blank">
    {{$url}}
  </a>
{{ end }}

エラー有りで返ってきた場合は単にURLの文字列のリンクとするように変えました。これで無事ビルドできるようになりました。