19
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

アイスタイルAdvent Calendar 2022

Day 12

【Nuxt.js】クライアントサイドのpluginsでエラーを処理する

Last updated at Posted at 2022-12-11

この記事は アイスタイル Advent Calendar 2022 12日目の記事です。

こんにちは、アイスタイルではフロントエンド周りをちまちま触っているsakaguchiiと申します。2022年はNuxt.jsと戯れることが多く今年もいくつか学びを得ることが出来た年となりました。
そのうちのひとつをご紹介したいと思います。

前提

Nuxt.js v2系

やろうとしたこと

  • ルートが変更されたら「Success」というログを表示
  • 404ページに遷移したら「Not Found」というログを表示
  • クライアントサイドで実行する

ルートが変更されたら「Success」というログを表示

plugins配下にjsを作成し、app.router.afterEachを使います。ここで記載された処理はルートが変更されたら(=ページ遷移したら)実行されます。
また、クライアントサイドで実行したいので {任意}.client.js という名前でファイルを作成します。
参照:プラグイン名の規約

export default ({ app }) => {
  app.router.afterEach((to, from) => {
    // ページ遷移したらログを表示
    console.log('Success') 
  })
}

エラーページに遷移したら「Not Found」というログを表示

Nuxt.jsのエラーをキャッチするためにapp内のnuxt.err.statusCodeを参照します。

export default ({ app }) => {
  app.router.afterEach((to, from) => {
    if(app.nuxt.err.statusCode === 404) { // 判定追加
        // 404ページに遷移したらログを表示
        console.log('Not Found') 
    } else {
        // ページ遷移したらログを表示
        console.log('Success') 
    }
  })
}

しかしこの方法ではステータスコードは取得できません
(表示上はエラーページに遷移しているのにapp.nuxt.errの中身は空っぽというへんてこな結果が返ってきました)

これはクライアントサイドのNuxtプラグインではredirectやerrorを使用することが出来ないためです。

参照:nuxtjs.org-コンテキスト

上記のドキュメントに記載の通り、window.onNuxtReady(() => { window.$nuxt.... }) を使ってこれを回避します。

export default ({ app }) => {
  app.router.afterEach((to, from) => {
    window.onNuxtReady(() => { // 追加
      if(window.$nuxt.nuxt.err.statusCode === 404) {
        // 404ページに遷移したらログを表示
        console.log('Not Found') 
      } else {
        // ページ遷移したらログを表示
        console.log('Success') 
      }
    })
  })
}

これで通常遷移したときも、404ページに遷移したときもログを表示することが出来ました。

おわり

以上になります。まとめてみるとサラッとしたものですが、当初この話を聞いた時は「ステータスコードが取れないならエラーページに遷移するはずがないのに遷移してて…でもステータスコードは取れない????なんで????🤔」と大分混乱していました。
まずはapp.nuxtの状態から確認しようと思いコンテキストのドキュメントをざっと眺めて、たまたま「It's not possible to use redirect or error in client-side Nuxt plugin」の文章を見つけたことで運よく回避することが出来ました。
これが正攻法か不安なところではありますが、期待通り動いてくれたのでとりあえずヨシということで。

ここまで読んでくださりありがとうございました😊

参考文献

19
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?