ページを作成する
page.tsx
を以下のように作成します。
async function getData() {
const res = await fetch('https://api.example.com/...')
if (!res.ok) {
throw new Error('エラーが発生しました。')
}
return res.json()
}
export default async function Page() {
const data = await getData()
return <main></main>
}
エラー画面を作成する
pages.tsx
と同じ階層にerror.tsx
を作成します。
'use client'
import { useEffect } from 'react'
export default function Error({
error,
reset,
}: {
error: Error & { digest?: string }
reset: () => void
}) {
useEffect(() => {
console.error(error)
}, [error])
return (
<div>
<h2>{error.message}</h2>
<button onClick={() => reset()}>
Try again
</button>
</div>
)
}
上記のように記述するとpage.tsx
のthrow new Error('エラーが発生しました。')
が実行された際にエラーが発生しました。
というメッセージと再実行するためのボタンが表示されます。
error.tsx
のerror.message
は本番環境ではAn error occurred in the Server Components render. The specific message is omitted in production builds to avoid leaking sensitive details. A digest property is included on this error instance which may provide additional details about the nature of the error.
というメッセージになります。
error.tsx
と同じ階層にnot-found.tsx
が存在しない場合にpage.tsx
でnotFound()
を実行するとnot-found.tsx
が表示されるのではなく、error.tsx
のerror.message
にNEXT_NOT_FOUND
が渡されて表示されます。