brand logo

ドキュメント

abortNavigation

abortNavigationは、ナビゲーションが行われるのを防ぎ、パラメータとして設定されたエラーをスローするヘルパー関数です。

abortNavigationルートミドルウェアハンドラー内でのみ使用可能です。

abortNavigation(err?: Error | string): false

パラメータ

err

  • : Error | string

    abortNavigationによってスローされるオプションのエラー。

以下の例は、ルートミドルウェアでabortNavigationを使用して、許可されていないルートアクセスを防ぐ方法を示しています:

middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  const user = useState('user')

  if (!user.value.isAuthorized) {
    return abortNavigation()
  }

  if (to.path !== '/edit-post') {
    return navigateTo('/edit-post')
  }
})

errを文字列として

エラーを文字列として渡すことができます:

middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  const user = useState('user')

  if (!user.value.isAuthorized) {
    return abortNavigation('権限が不十分です。')
  }
})

errをエラーオブジェクトとして

エラーをErrorオブジェクトとして渡すことができます。例えば、catchブロックで捕捉された場合:

middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  try {
    /* エラーをスローする可能性のあるコード */
  } catch (err) {
    return abortNavigation(err)
  }
})

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

abortNavigationとは?〜ナビゲーション制御の強力な味方〜

Nuxtのルートミドルウェアでナビゲーションを制御する際、特定の条件下でページ遷移を中断したいことがあります。例えば、認証されていないユーザーのアクセスを防ぎたい場合や、フォームの未保存状態での離脱を阻止したい場合などです。そんなときに役立つのがabortNavigation関数です。

abortNavigationは、ナビゲーションを即座に中断し、必要に応じてエラーをスローできるヘルパー関数です。これにより、ユーザーの意図しないページ遷移を防ぎ、アプリケーションの状態を安全に保つことが可能になります。


まず結論:abortNavigationのポイント

  • ナビゲーションを中断できる:ルートミドルウェア内で呼び出すと、現在のページ遷移を停止する。
  • エラーを渡せる:文字列やErrorオブジェクトを引数に渡し、理由を明示的に伝えられる。
  • ルートミドルウェア限定abortNavigationはミドルウェア内でのみ使用可能で、他の場所では動作しない。
  • 戻り値は常にfalse:中断を示すためにfalseを返す仕様。
  • SSR/CSR両対応:サーバーサイドレンダリングとクライアントサイドレンダリングの両方で適切に動作。

いつ使うべき?使わない方がよいケースは?

使うべきケース

  • 認証・認可チェック
    ユーザーの権限が不足している場合にページ遷移を阻止し、アクセス制限を実装したいとき。

  • フォームの未保存警告
    ユーザーが入力途中のフォームを離脱しようとした際に、意図しない遷移を防ぎたいとき。

  • 特定条件下での遷移制御
    例えば、特定のパラメータが不正な場合や、APIレスポンスに基づいて遷移を中断したい場合。

使わない方がよいケース

  • ミドルウェア以外の場所での使用
    abortNavigationはルートミドルウェア専用なので、コンポーネントのライフサイクルや他のComposable内で使うべきではありません。

  • 単純なリダイレクトだけをしたい場合
    ナビゲーションを中断して別のページに遷移させたいだけなら、navigateToを使う方が明確です。

  • エラーハンドリングが不要な場合
    エラーをスローせず単に遷移を止めたいだけなら、abortNavigation()の引数は省略可能ですが、エラー情報が必要な場合は適切に渡しましょう。


実務でよくあるユースケースとサンプルコード

1. 認証チェックでのアクセス制限

export default defineNuxtRouteMiddleware((to, from) => {
  const user = useState('user')

  if (!user.value.isAuthorized) {
    // 権限がない場合はナビゲーションを中断
    return abortNavigation('権限がありません。ログインしてください。')
  }
})

この例では、認証されていないユーザーのページ遷移を中断し、エラーメッセージを渡しています。

2. フォームの未保存状態での離脱防止

export default defineNuxtRouteMiddleware((to, from) => {
  const isFormDirty = useState('isFormDirty')

  if (isFormDirty.value) {
    // フォームに未保存の変更がある場合は遷移を中断
    return abortNavigation('未保存の変更があります。ページを離れないでください。')
  }
})

ユーザーが入力途中のフォームを誤って離脱しないように制御します。

3. APIレスポンスに基づく遷移制御

export default defineNuxtRouteMiddleware(async (to, from) => {
  try {
    const response = await $fetch('/api/check-access', { params: { id: to.params.id } })
    if (!response.allowed) {
      return abortNavigation(new Error('このページへのアクセスは許可されていません。'))
    }
  } catch (err) {
    return abortNavigation(err)
  }
})

APIからのレスポンスを元にアクセス制御を行い、問題があれば遷移を中断します。


よくある落とし穴・注意点

1. ルートミドルウェア以外での使用禁止

abortNavigationはルートミドルウェア内でのみ動作します。コンポーネントのsetuponMountedなどで使うとエラーになるため注意してください。

2. SSRとCSRでの挙動の違いに注意

サーバーサイドレンダリング中にabortNavigationを呼ぶと、サーバー側で遷移が中断されるため、クライアントに返されるHTMLが変わります。CSR時はブラウザ上で遷移が止まるため、ユーザー体験に差が出ることがあります。これを踏まえ、ミドルウェアのロジックは両環境で一貫性を保つよう設計しましょう。

3. Hydrationエラーの可能性

ナビゲーション中断により、期待したページ遷移が行われない場合、Hydration時に不整合が起きることがあります。特に、遷移先のコンポーネントが期待通りにマウントされない場合は、ミドルウェアの条件を見直すことが重要です。

4. パフォーマンスへの影響

ミドルウェア内で重い処理やAPIコールを行い、その結果でabortNavigationを呼ぶ場合、遷移が遅延する可能性があります。可能な限り非同期処理は効率化し、必要最低限のチェックに留めることを推奨します。


まとめ

abortNavigationはNuxtのルートミドルウェアでナビゲーションを安全かつ柔軟に制御するための強力なツールです。認証チェックやフォームの未保存警告、APIレスポンスに基づくアクセス制御など、実務で頻繁に使われます。ただし、ルートミドルウェア限定の関数であることやSSR/CSRの挙動差、Hydrationエラーのリスクなど、使い方には注意が必要です。

適切に活用すれば、ユーザー体験を損なわずに堅牢なナビゲーション制御が実現できるため、ぜひ理解を深めて実務に役立ててください。


abortNavigationを使う際は、エラー内容を明確にしておくと、後続のエラーハンドリングやユーザーへのフィードバックがスムーズになります。