injectを使用して共通エラー処理メソッドを作成しよう【Nuxt×TypeScript】
  • 2022.02.03に公開
  • ブログ構築TS
  • 7. コンテンツページ構築
  • No.4 / 8

今回達成すること

Nuxtのinject機能を使用して、アプリ全体で使用できる共通エラー処理メソッドを作成します。

Nuxtのinjectとは

アプリ全体で関数や値を利用したい場合に、これら共通の処理をVueインスタンスに挿入する機能です。

inject('呼び出し名', <共通の値>)

Vueインスタンスに挿入することで、アプリのどこからでも呼び出せるようになります。

呼び出し時は'呼び出し名'のキーに $ をつけて呼び出します。

inject宣言
export default (_context, inject) => {
  const hoge = 'hogehoge'
  inject('foo', hoge)
}
Vueインスタンスの呼び出し
console.log(this.$foo.hoge)

=> hogehoge

今回は、inject()の第二引数にクラスを渡し、そのクラス内にアプリ全体で使用する関数を用意します。

Doc: Inject in $root & context

pluginファイルを作成する

inject()を宣言する場所は、pluginsディレクトリ内のjs(or ts)ファイルです。

今回はmy-plugins.tsというファイルを作成し、その中に共通関数を置きます。

% touch plugins/my-plugin.ts

作成したファイルは以下の編集を行います。

plugins/my-plugin.ts
// Plugin Doc: https://typescript.nuxtjs.org/cookbook/plugins/
import { Plugin, Context } from '@nuxt/types'

export interface MyPluginInterface {
}

class MyPlugin implements MyPluginInterface {
  error

  constructor (ctx: Context) {
    this.error = ctx.error
  }
}

const myPlugin: Plugin = (context: Context, inject) => {
  inject('my', new MyPlugin(context))
}

export default myPlugin
  • import { Plugin, Context } from '@nuxt/types' ... pluginファイルのエクスポートはPluginの型をインポートする。
  • MyPluginInterface ... クラスに当てがうインターフェースの宣言。
  • class MyPlugin implements ... クラスにインターフェースを宣言する場合はimplementsを使用する。
  • error ... constructor()内でthis.errorを使用するため、先に宣言する必要がある。
  • this.error = ctx.error ... Nuxtが用意しているコンテキストからerrorメソッドを代入している。

injectにクラスを渡す

injectの第二引数で、クラスをnewすることによってそのクラス内の関数や定数を使用できるようになります。

ちなみにこのMyPluginクラスは、Nuxt上で$myで呼び出すことができます。

inject('my', new MyPlugin(context))

共通エラー処理メソッドを作成する

宣言したMyPluginクラスに、エラー処理を行うメソッドを作成します。

plugins/my-plugin.ts
export interface MyPluginInterface {
  // 追加
  errorHandler (statusCode: number): void
  errorMessage (statusCode: number): string
}

class MyPlugin implements MyPluginInterface {
  error

  constructor (ctx: Context) {
    this.error = ctx.error
  }

  // 以下、追加

  // 引数のエラーコードのエラーを発生させる
  errorHandler (statusCode: number) {
    this.error({
      statusCode,
      message: this.errorMessage(statusCode)
    })
  }

  // 引数のエラーコードによってエラーメッセージを切り替える
  errorMessage (statusCode: number) {
    switch (statusCode) {
      /* ここに出力したいメッセージを追加する */
      case 404: return 'This page could not be found'
      case 500: return 'Server error'
      default: return 'Error'
    }
  }
}

Nuxtにpluginファイルを登録する

nuxt.config.jsに作成したpluginファイルを登録します。

nuxt.config.js
export default {
  ...
   plugins: [
    '~/plugins/vuetify',
    // 追加
    '~/plugins/my-plugin'
  ],
}

以上でMyPluginクラスをどこからでも呼び出せるようになりました。

@nuxt/typesにMyPluginクラスの型を追加する

現状のままMyPluginクラスを呼び出すと、タイプエラーになります。

2022-02-03 12-26-45

そこで、

  • Vueの型定義を行なっているvue/typesと、
  • Nuxtの型定義を行なっている@nuxt/types

MyPluginクラスの型を登録します。

module.d.tsを開きましょう。

types/module.d.ts
import { accessorType } from '~/store'
// 追加
import { MyPluginInterface } from '~/plugins/my-plugin'

declare module 'vue/types/vue' {
  // Vueインスタンス(this)の型追加
  interface Vue {
    // nuxt-typed-vuex
    // Doc: https://typed-vuex.roe.dev/getting-started/getting-started-nuxt#creating-type-definitions
    $accessor: typeof accessorType
    // 追加
    // plugins/my-plugin.ts
    $my: MyPluginInterface
  }
}

declare module '@nuxt/types' {
  // 追加
  // Nuxt Contextへの型追加
  interface Context {
    // plugins/my-plugin.ts
    $my: MyPluginInterface
  }

  // NuxtAppOptions(Context.app)への型追加
  interface NuxtAppOptions {
    // nuxt-typed-vuex
    $accessor: typeof accessorType
  }
}
  • interface Vue ... this以下にプロパティを追加する場合の型定義場所。(例)this.$my
  • interface Context ... asyncData({ $my }) などのNuxtコンテキストで呼び出す場合の型定義場所。
  • interface NuxtAppOptions ... Nuxtコンテキストのapp以下にプロパティを追加する場合の型定義場所。(例)app.$my

これでタイプエラーなく$myが使用できるようになりました。

mounted (): void {
  console.log(this.$my)
}

// Console
=> ▶︎ MyPlugin {error: ƒ}

今後、自作プラグインを作成する場合は、vue/types@nuxt/typesに型を登録することを覚えておいてください。

コンテンツページから$myを呼び出そう

pages/categories/_slug.vueに移動し、$myMyPluginクラスのerrorHandler()メソッドを呼び出しましょう。

pages/categories/_slug.vue
// コンテキストのerror削除。$my追加
asyncData ({ app: { $accessor }, params, $my }: Context): AsyncData {
  const category: BlogCategory | undefined =
    $accessor.categories.find((category: BlogCategory) =>
      category.fields.slug === params.slug
    )

  if (!category) {
    // 書き換え
    return $my.errorHandler(404)
    // return error({
    //   statusCode: 404,
    //   message: 'This page could not be found'
    // })
  }

  const categoryPosts: BlogPost[] = $accessor.categoryPosts[category.sys.id]

  return {
    category,
    categoryPosts
  }
}

これで前回の挙動と同じく、存在しないパスにアクセスすると404エラーが発生します。

本番環境の挙動も確認してみる

ここまでの変更を本番環境にデプロイし、本番での挙動も確認してみてください。

% yarn netlify:deploy

存在しないパスにアクセスしてみましょう。

本番環境ではNetlifyが用意している404エラーページに遷移します。

Nuxtのエラーページを表示する設定はもう少し先で行います。

2022-02-03 13-14-52

今回の作業は以上です。

% git add -A
% git commit -m "Add MyPlugin class to plugin file"

まとめと次回

今回は、Nuxtのinjectを使用して共通エラーメソッドを作成しました。

次回はブログ記事のコンテンツページを作成します。

CSSなどの設定は全ての機能が揃ってから設定していきます。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
ブログ構築TSの投稿
1
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #01
Nuxt.jsをローカルPCに立ち上げよう
2
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #02
Nuxt.jsプロジェクトをGitHubにPushしよう
3
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #03
nuxt-property-decoratorのインストールとTypeScriptのセットアップ
1
  • Vuetifyセットアップ
  • /
  • #01
TypeScript環境のNuxt.jsにVuetifyを導入しよう
2
  • Vuetifyセットアップ
  • /
  • #02
VuetifyにカスタムCSSを追加してSASS変数を理解しよう
3
  • Vuetifyセットアップ
  • /
  • #03
VuetifyにカスタムSVGアイコンを追加しよう
1
  • NetlifyCLIを使ったNuxtデプロイ
  • /
  • #01
Netlify CLIをインストールして本番環境のサイトを作成しよう
2
  • NetlifyCLIを使ったNuxtデプロイ
  • /
  • #02
netlify.tomlを使ってNuxt.jsをNetlifyに手動デプロイしよう
1
  • Contentfulモデル構築
  • /
  • #01
Contentfulの料金とCommunityプランの無料枠を理解する
2
  • Contentfulモデル構築
  • /
  • #02
Contentfulへ新規会員登録、ロケールの変更、API Keyの発行を行う
3
  • Contentfulモデル構築
  • /
  • #03
Contentful ブログカテゴリーモデルを作成しよう
4
  • Contentfulモデル構築
  • /
  • #04
Contentful カテゴリーモデルに1対1で関連づくblogPostモデルを作成しよう
5
  • Contentfulモデル構築
  • /
  • #05
Contentful ブログ記事に1対多で関連づくplogTagモデルを作成しよう
6
  • Contentfulモデル構築
  • /
  • #06
Contentful カテゴリー・ブログ記事・タグコンテンツを作成しよう
1
  • Nuxt.js×Contentfulセットアップ
  • /
  • #01
Nuxt.js×Contentfulセットアップ。モジュールのインストールからAPI Keyの登録まで
2
  • Nuxt.js×Contentfulセットアップ
  • /
  • #02
Contentful APIリクエストの実行 Nuxt.jsにブログコンテンツを表示しよう
3
  • Nuxt.js×Contentfulセットアップ
  • /
  • #03
ContentfulAPIをNetlifyにデプロイしよう【Nuxt FullStaticのasyncDataとfetch】
1
  • Vuex×TypeScriptセットアップ
  • /
  • #01
Vuexの型付け vuex-module-decoratorsとnuxt-typed-vuexどちらを使用するか
2
  • Vuex×TypeScriptセットアップ
  • /
  • #02
nuxt-typed-vuexのインストールとセットアップ。Vuexの型定義と呼び出し方
3
  • Vuex×TypeScriptセットアップ
  • /
  • #03
VuexにContentfulの型定義ファイルとnuxtServerInitを追加しよう
4
  • Vuex×TypeScriptセットアップ
  • /
  • #04
VuexにContentfulAPIレスポンスを保存してVueファイルに表示しよう
1
  • コンテンツページ構築
  • /
  • #01
ブログアプリのページ設計とNuxt.jsの動的ルーティングについて理解しよう
2
  • コンテンツページ構築
  • /
  • #02
カテゴリーのコンテンツページを作成しよう【Nuxt.js×Contentful】
3
  • コンテンツページ構築
  • /
  • #03
カテゴリーに関連付くブログ記事一覧を表示しよう【Nuxt.js×Contentful】
4
  • コンテンツページ構築
  • /
  • #04
injectを使用して共通エラー処理メソッドを作成しよう【Nuxt×TypeScript】
5
  • コンテンツページ構築
  • /
  • #05
NuxtChildを使用してブログ記事ページを作成しよう【Nuxt.js×TypeScript】
6
  • コンテンツページ構築
  • /
  • #06
タグ一覧ページとタグ関連づく記事一覧を表示しよう【Nuxt.js×TypeScript】
7
  • コンテンツページ構築
  • /
  • #07
プライバシーポリシーページを作成しよう【Nuxt.js×TypeScript】
8
  • コンテンツページ構築
  • /
  • #08
@nuxtjs/i18nのインストールとセットアップ。ページタイトルの翻訳化【TypeScript】
1
  • NetlifyFunctionsを使った検索機能
  • /
  • #01
Netlify Functionsを使ってクエリを返す関数を作成しよう【Nuxt.js×TypeScript】
2
  • NetlifyFunctionsを使った検索機能
  • /
  • #02
Netlify Functionsプロジェクトをデプロイしよう【Nuxt.js×TypeScript】
3
  • NetlifyFunctionsを使った検索機能
  • /
  • #03
Nuxt.js × axiosセットアップ Netlify Functionsにリクエストを行う準備をしよう
4
  • NetlifyFunctionsを使った検索機能
  • /
  • #04
オリジン•CORS•プリフライトリクエストを理解する【Nuxt.js×Netlify Functions】
5
  • NetlifyFunctionsを使った検索機能
  • /
  • #05
Netlify Functionsを使ってフォームバリデーション機能を構築しよう【Nuxt.js】
6
  • NetlifyFunctionsを使った検索機能
  • /
  • #06
ツールバーに表示する検索フォームを作成しよう【Nuxt.js×TypeScript】
7
  • NetlifyFunctionsを使った検索機能
  • /
  • #07
検索ページを作成しよう【Vue propsとTypeScriptの書き方 解説】
8
  • NetlifyFunctionsを使った検索機能
  • /
  • #08
Netlify FunctionsからContentfulAPIリクエストを送ろう【Nuxt.js】
9
  • NetlifyFunctionsを使った検索機能
  • /
  • #09
検索ページに「もっと見る」ボタンを実装しよう【Nuxt.js×TypeScript】
1
  • ブログMarkdown対応
  • /
  • #01
@nuxtjs/markdownitのインストールとセットアップ【Nuxt.js×TypeScript】
2
  • ブログMarkdown対応
  • /
  • #02
Nuxt.js×markdown-it 外部リンクを別タブで開くプラグインを追加しよう
3
  • ブログMarkdown対応
  • /
  • #03
Nuxt.js×markdown-it 内部リンクをVueRouterで高速にページ遷移しよう
4
  • ブログMarkdown対応
  • /
  • #04
Nuxt.js×markdown-it アンカーリンクとブログ目次を自動生成しよう
独学プログラマ
独学でも、ここまでできるってよ。
CONTACT
Nuxt.js制作のご依頼は下記メールアドレスまでお送りください。