最終更新日: 2023年08月15日
エラー処理
異なるライフサイクルでエラーをキャッチする方法を学びましょう。
エラー処理
Nuxt3はフルスタックのフレームワークです。そのため、さまざまなコンテキストで発生するユーザーのランタイムエラーは、防止できないソースから発生する可能性があります。
- Vueのレンダリングライフサイクル中のエラー(SSR + SPA)
- APIやNitroサーバーのライフサイクル中のエラー
- サーバーおよびクライアントの起動エラー(SSR + SPA)
- JSチャンク(データの細分化)のダウンロードエラー
Vueのレンダリングライフサイクル中のエラー(SSR + SPA)
onErrorCaptured
を使用してVueのエラーにフックすることができます。
さらに、Nuxtはvue:error
フックも提供しており、エラーがトップレベルまで伝播した場合に呼び出されます。
エラーレポートフレームワークを使用している場合は、vueApp.config.errorHandler
を介してグローバルなハンドラを提供することができます。これにより、処理されているエラーも含めて、すべてのVueのエラーを受け取ることができます。
グローバルエラーリポートフレームワークの事例
- ts
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.config.errorHandler = (error, context) => {
// ...
};
});
サーバーとクライアントセットアップエラー (SSR + SPA)
Nuxtアプリケーションの起動中にエラーが発生した場合、Nuxtはapp:error
フックを呼び出します。
これには以下が含まれます。:
- Nuxtプラグインの実行
app:created
とapp:beforeMount
フックの処理- VueアプリケーションをHTMLにレンダリングする(サーバーサイド)
- アプリケーションのマウント(クライアントサイド)。ただし、このケースは
またはonErrorCaptured
vue:error
で処理する必要があります。 - app:mountedフックの処理
APIまたはNitroサーバーライフサイクル中のエラー
これらのエラーに対しては、現在サーバーサイドのハンドラを定義することはできませんが、エラーページをレンダリングすることは可能です(次のセクションを参照)。
JavaScriptのダウンロードエラー
ネットワーク接続障害または新しいデプロイメント (古いハッシュ化された JS チャンク URL が無効になる) が原因で、チャンク読み込みエラーが発生する可能性があります。 Nuxt は、ルート ナビゲーション中にチャンクのロードに失敗した場合にハード リロードを実行することにより、チャンクのロード エラーを処理するための組み込みサポートを提供します。
この動作を変更するには、experimental.emitRouteChunkError
をfalse
に設定する(これにより、これらのエラーにフックが行われなくなる)か、manual
に設定することで自分自身で処理できます。チャンクの読み込みエラーを手動で処理する場合は、自動的な実装を参考にすることができます。
エラーページのレンダリング
Nuxtが致命的なエラーに遭遇した場合、サーバーライフサイクル中またはVueアプリケーションのレンダリング中(SSRおよびSPAの両方)、JSONレスポンス(Accept: application/json
ヘッダーでリクエストされた場合)またはHTMLのエラーページをレンダリングします。
エラーページをカスタマイズするには、アプリケーションのソースディレクトリにapp.vue
と同じ階層に~/error.vue
を追加します。このページは単一のプロパティerror
を持ち、ハンドリングするためのエラーオブジェクトが含まれています。
事例
- error.vue
- vue
<template>
<button @click="handleError">Clear errors</button>
</template>
<script setup>
const props = defineProps({
error: Object,
});
const handleError = () => clearError({ redirect: "/" });
</script>
エラーの補助メソッド
useError
function useError (): Ref<Error | { url, statusCode, statusMessage, message, description, data }>
この関数は、処理されているグローバルな Nuxt エラーを返します。
Info 詳細は「Docs > API > Composables > Use Error」を参照してください。
createError
function createError (err: { cause, data, message, name, stack, statusCode, statusMessage, fatal }): Error
この関数を使用して、追加のメタデータを持つエラーオブジェクトを作成できます。これは、Vue ポーションと Nitro ポーションの両方で使用でき、スローするために意図されています。
もし、createError
で作成されたエラーをスローする場合:
- サーバーサイドでは、フルスクリーンのエラーページが表示され、
clearError
でクリアすることができます。 - クライアントサイドでは、ハンドルするために非致命的なエラーがスローされます。フルスクリーンのエラーページをトリガーする必要がある場合は、
fatal:true
を設定することもできます。
事例
- pages/movies/[slug
- ts
<script setup>
const route = useRoute()
const { data } = await useFetch(`/api/movies/${route.params.slug}`)
if (!data.value) {
throw createError({ statusCode: 404, statusMessage: 'Page Not Found' })
}
</script>
showError
function showError (err: string | Error | { statusCode, statusMessage }): Error
この関数はクライアントサイドのどのタイミングでも呼び出すことができます。また、サーバーサイドでは、ミドルウェアやプラグイン、setup() 関数の中で直接呼び出すことができます。これにより、フルスクリーンのエラーページがトリガーされます。エラーページは clearError を使用してクリアすることができます。
代わりに、throw createError() を使用することをおすすめします。
Info 詳細は「Docs > API > Utils > Show Error」を参照してください。
clearError
function clearError (options?: { redirect?: string }): Promise<void>
この関数は現在処理中の Nuxt エラーをクリアします。オプションでリダイレクト先のパスを指定することもできます(例えば、'安全な' ページに移動する場合など)。
Info 詳細は「Docs > API > Utils > Clear Error」を参照してください。
アプリ内でエラーをレンダリング
Nuxtは、<NuxtErrorBoundary>
コンポーネントも提供しており、これを使用すると、エラーページ全体を置き換えることなく、アプリ内でクライアントサイドのエラーを処理できます。
このコンポーネントは、デフォルトのスロット内で発生するエラーを処理する責任があります。クライアントサイドでは、エラーをトップレベルに伝播させず、代わりに #error
スロットをレンダリングします。
#error
スロットは、エラーをプロップとして受け取ります(error = null
に設定するとデフォルトのスロットを再レンダリングします。ただし、エラーが完全に解決されていない場合、エラースロットは2回レンダリングされる可能性があるため、最初にエラーが完全に解決されていることを確認する必要があります)。
Example
- pages/index.vue
- vue
<template>
<!-- some content -->
<NuxtErrorBoundary @error="someErrorLogger">
<!-- デフォルトのスロットを使用してコンテンツをレンダリングする -->
<template #error="{ error, clearError }">
You can display the error locally here: {{ error }}
<button @click="clearError">This will clear the error.</button>
</template>
</NuxtErrorBoundary>
</template>
Info 詳細と事例は「Docs > Examples > Advanced > Error Handling」から確認することができます。