Menu

カスタムエラー

404ページ

404ページは非常に頻繁にアクセスされる可能性があります。すべてのアクセスでエラーページをサーバーレンダリングすると、Next.jsサーバーの負荷が増加します。これにより、コストの増加と遅いユーザー体験が生じる可能性があります。

これらの欠点を避けるため、Next.jsはデフォルトで追加のファイルなしで静的な404ページを提供します。

404ページのカスタマイズ

カスタムの404ページを作成するには、pages/404.jsファイルを作成します。このファイルはビルド時に静的に生成されます。

pages/404.js
export default function Custom404() {
  return <h1>404 - ページが見つかりません</h1>
}

補足: ビルド時にデータを取得する必要がある場合、このページ内で getStaticProps を使用できます。

500ページ

エラーページを毎回サーバーレンダリングすることは、エラー対応の複雑さを増加させます。ユーザーがエラーに対する応答をできるだけ早く取得できるよう、Next.jsはデフォルトで追加のファイルなしで静的な500ページを提供します。

500ページのカスタマイズ

500ページをカスタマイズするには、pages/500.jsファイルを作成します。このファイルはビルド時に静的に生成されます。

pages/500.js
export default function Custom500() {
  return <h1>500 - サーバーサイドでエラーが発生しました</h1>
}

補足: ビルド時にデータを取得する必要がある場合、このページ内で getStaticProps を使用できます。

より高度なエラーページのカスタマイズ

500エラーは、クライアントサイドとサーバーサイドの両方でErrorコンポーネントによって処理されます。オーバーライドする場合は、pages/_error.jsファイルを定義し、以下のコードを追加します:

function Error({ statusCode }) {
  return (
    <p>
      {statusCode
        ? `サーバーでエラー ${statusCode} が発生しました`
        : 'クライアントでエラーが発生しました'}
    </p>
  )
}
 
Error.getInitialProps = ({ res, err }) => {
  const statusCode = res ? res.statusCode : err ? err.statusCode : 404
  return { statusCode }
}
 
export default Error

pages/_error.jsは本番環境でのみ使用されます。開発環境では、エラーの発生元を知るためにコールスタックを含むエラーが表示されます。

組み込みのエラーページの再利用

組み込みのエラーページをレンダリングする場合は、Errorコンポーネントをインポートできます:

import Error from 'next/error'
 
export async function getServerSideProps() {
  const res = await fetch('https://api.github.com/repos/vercel/next.js')
  const errorCode = res.ok ? false : res.status
  const json = await res.json()
 
  return {
    props: { errorCode, stars: json.stargazers_count },
  }
}
 
export default function Page({ errorCode, stars }) {
  if (errorCode) {
    return <Error statusCode={errorCode} />
  }
 
  return <div>Next stars: {stars}</div>
}

Errorコンポーネントは、statusCodeと一緒にテキストメッセージを渡す場合、titleプロパティも受け取ります。

カスタムのErrorコンポーネントがある場合は、必ずそれをインポートしてください。next/errorは、Next.jsで使用されるデフォルトコンポーネントをエクスポートします。

注意点