エラー処理
Nuxtはフルスタックフレームワークであるため、さまざまなコンテキストで発生する可能性のある、防ぐことができないユーザーランタイムエラーのソースがいくつかあります。
- Vueレンダリングライフサイクル中のエラー(SSRとCSR)
- サーバーとクライアントの起動エラー(SSR + CSR)
- Nitroサーバーライフサイクル中のエラー(
server/
ディレクトリ) - JSチャンクのダウンロードエラー
Vueエラー
onErrorCaptured
を使用してVueエラーをフックできます。
さらに、Nuxtは、エラーがトップレベルに伝播した場合に呼び出される vue:error
フックを提供します。
エラー報告フレームワークを使用している場合は、vueApp.config.errorHandler
を介してグローバルハンドラーを提供できます。処理された場合でも、すべてのVueエラーを受け取ります。
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.config.errorHandler = (error, instance, info) => {
// handle error, e.g. report to a service
}
// Also possible
nuxtApp.hook('vue:error', (error, instance, info) => {
// handle error, e.g. report to a service
})
})
vue:error
フックは、onErrorCaptured
ライフサイクルフックに基づいていることに注意してください。起動エラー
Nuxtアプリケーションの起動中にエラーが発生した場合、Nuxtは app:error
フックを呼び出します。
これには以下が含まれます。
- Nuxtプラグインの実行
app:created
およびapp:beforeMount
フックの処理- VueアプリをHTMLにレンダリングする(SSR中)
- アプリのマウント(クライアント側)。ただし、この場合は
onErrorCaptured
またはvue:error
で処理する必要があります app:mounted
フックの処理
Nitroサーバーエラー
現在、これらのエラーのサーバー側ハンドラーを定義することはできませんが、エラーページをレンダリングできます。エラーページのレンダリングセクションを参照してください。
JSチャンクのエラー
ネットワーク接続の失敗または新しいデプロイ(古いハッシュ化されたJSチャンクURLが無効になる)により、チャンクの読み込みエラーが発生する可能性があります。 Nuxtは、ルートナビゲーション中にチャンクの読み込みに失敗した場合にハードリロードを実行することにより、チャンクの読み込みエラーを処理するための組み込みサポートを提供します。
この動作を変更するには、experimental.emitRouteChunkError
を false
(これらのエラーへのフッキングを完全に無効にする)または manual
(手動で処理する場合)に設定します。チャンクの読み込みエラーを手動で処理する場合は、自動実装 を参考にしてください。
エラーページ
fatal: true
で作成されたエラー)に遭遇した場合、Accept: application/json
ヘッダーで要求された場合はJSONレスポンスをレンダリングするか、フルスクリーンエラーページをトリガーします。サーバーライフサイクル中に、以下の場合にエラーが発生する可能性があります。
- Nuxtプラグインの処理中
- VueアプリをHTMLにレンダリングする際
- サーバーAPIルートがエラーをスローした場合
また、クライアント側では、以下の場合に発生する可能性があります。
- Nuxtプラグインの処理中
- アプリケーションのマウント前(
app:beforeMount
フック) onErrorCaptured
またはvue:error
フックでエラーが処理されなかった場合にアプリをマウントする際- Vueアプリがブラウザで初期化およびマウントされた場合(
app:mounted
)
アプリケーションのソースディレクトリにapp.vue
と並んで~/error.vue
を追加することで、デフォルトのエラーページをカスタマイズできます。
<script setup lang="ts">
import type { NuxtError } from '#app'
const props = defineProps({
error: Object as () => NuxtError
})
const handleError = () => clearError({ redirect: '/' })
</script>
<template>
<div>
<h2>{{ error.statusCode }}</h2>
<button @click="handleError">Clear errors</button>
</div>
</template>
カスタムエラーの場合、ページ/コンポーネントのsetup関数で呼び出すことができるonErrorCaptured
コンポーザブル、またはnuxtプラグインで設定できるvue:error
ランタイムnuxtフックを使用することを強くお勧めします。
export default defineNuxtPlugin(nuxtApp => {
nuxtApp.hook('vue:error', (err) => {
//
})
})
エラーページを削除する準備ができたら、clearError
ヘルパー関数を呼び出すことができます。この関数は、リダイレクト先のパスをオプションで指定できます(たとえば、「安全な」ページに移動する場合)。
$route
やuseRouter
など)を使用する前に確認してください。useError
を使用して、エラーが処理されているかどうかを確認できます。エラーユーティリティ
useError
function useError (): Ref<Error | { url, statusCode, statusMessage, message, description, data }>
この関数は、処理されているグローバルNuxtエラーを返します。
createError
function createError (err: string | { cause, data, message, name, stack, statusCode, statusMessage, fatal }): Error
追加のメタデータを含むエラーオブジェクトを作成します。エラーのmessage
として設定する文字列、またはエラープロパティを含むオブジェクトを渡すことができます。アプリのVue部分とサーバー部分の両方で使用でき、スローすることを意図しています。
createError
で作成されたエラーをスローした場合
- サーバー側では、
clearError
でクリアできるフルスクリーンエラーページがトリガーされます。 - クライアント側では、処理するための致命的でないエラーがスローされます。フルスクリーンエラーページをトリガーする必要がある場合は、
fatal: true
を設定することで実行できます。
<script setup lang="ts">
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()
を使用することをお勧めします。
clearError
function clearError (options?: { redirect?: string }): Promise<void>
この関数は、現在処理されているNuxtエラーをクリアします。また、リダイレクト先のパスをオプションで指定できます(たとえば、「安全な」ページに移動する場合)。
コンポーネントでのエラーのレンダリング
Nuxtは、サイト全体をエラーページに置き換えることなく、アプリ内でクライアント側のエラーを処理できる<NuxtErrorBoundary>
コンポーネントも提供しています。
このコンポーネントは、デフォルトスロット内で発生するエラーを処理します。クライアント側では、エラーがトップレベルにバブリングするのを防ぎ、代わりに#error
スロットをレンダリングします。
#error
スロットは、プロップとしてerror
を受け取ります。 (error = null
を設定すると、デフォルトスロットの再レンダリングがトリガーされます。エラーが最初に完全に解決されていることを確認する必要があります。そうでない場合、エラースロットは2回目にレンダリングされます。)
<template>
<!-- some content -->
<NuxtErrorBoundary @error="someErrorLogger">
<!-- You use the default slot to render your content -->
<template #error="{ error, clearError }">
You can display the error locally here: {{ error }}
<button @click="clearError">
This will clear the error.
</button>
</template>
</NuxtErrorBoundary>
</template>