1 つの記事で Vue ミドルウェア パイプラインを学ぶ

1 つの記事で Vue ミドルウェア パイプラインを学ぶ

SPA を構築する場合、多くの場合、特定のルートを保護する必要があります。たとえば、認証されたユーザーだけがアクセスできるダッシュボード ルートがあるとします。認証ミドルウェアを使用すると、正当なユーザーだけがアクセスできるようにすることができます。

このチュートリアルでは、Vue-Router[1]を使用してVueアプリケーションのミドルウェアパイプラインを実装する方法を学習します。

ミドルウェア パイプラインとは何ですか?

ミドルウェア パイプラインは、互いに並行して実行されるさまざまなミドルウェアの集まりです。

前の例を続けて、/dashboard/movies に、登録したユーザーだけがアクセスできるようにしたい別のルートがあるとします。ダッシュボード ルートにアクセスするには、認証が必要であることはすでにわかっています。では、認証されサブスクライブされたユーザーだけがアクセスできるようにするには、/dashboard/movies ルートをどのように保護すればよいでしょうか?ミドルウェア パイプラインを使用すると、複数のミドルウェアを連結し、それらを並行して実行できるようになります。

始める

まず、Vue CLI[2]を使用して新しいVueプロジェクトを素早く構築します。

vue は vue-middleware-pipeline を作成します

依存関係をインストールする

プロジェクト ディレクトリが作成され、インストールされたら、新しく作成されたディレクトリに移動し、ターミナルから次のコマンドを実行します。

npm i vue-router vuex

Vue-router[3] — Vue.jsの公式ルーターです

Vuex[4] — Vueの状態管理ライブラリです

コンポーネントの作成

私たちのプログラムは3つの要素から構成されます。

ログイン - このコンポーネントは、まだ認証されていないユーザーに表示されます。

ダッシュボード - このコンポーネントはログインしたユーザーに表示されます。

映画 — ログインしていてアクティブなサブスクリプションを持つユーザーにこのコンポーネントが表示されます。

これらのコンポーネントを作成しましょう。 src/components ディレクトリに移動し、次のファイルを作成します: Dashboard.vue、Login.vue、Movies.vue

次のコードを使用して Login.vue ファイルを編集します。

<テンプレート>
  <div>
    <p>これはログインコンポーネントです</p>
  </div>
</テンプレート>

次のコードを使用して Dashboard.vue ファイルを編集します。

<テンプレート>
  <div>
    <p>これは認証されたユーザー用のダッシュボード コンポーネントです</p>
    <ルータービュー/>
  </div>
</テンプレート>

最後に、Movies.vue ファイルに次のコードを追加します。

<テンプレート>
  <div>
    <p>これは、認証され登録されたユーザー向けの映画コンポーネントです</p>
  </div>
</テンプレート>

ストアを作成する

Vuex に関する限り、ストアはプログラムの状態を保存するための単なるコンテナです。これにより、ユーザーが認証されているかどうかを確認できるだけでなく、ユーザーがサブスクライブされているかどうかも確認できます。

src フォルダーに store.js ファイルを作成し、次のコードを追加します。

'vue' から Vue をインポートします
'vuex' から Vuex をインポートします

Vue.use(Vuex)

デフォルトの新しいVuex.Storeをエクスポートします({
    州: {
        ユーザー: {
            ログイン: false、
            購読済み: false
        }
    },
    ゲッター: {
        認証(状態) {
            state.user を返す
        }
    }
})

ストアには、その状態のユーザー オブジェクトが含まれます。ユーザー オブジェクトには loggedIn プロパティと isSubscribed プロパティが含まれており、ユーザーがログインしていて有効なサブスクリプションを持っているかどうかを判断するのに役立ちます。また、ユーザー オブジェクトを返すためにストア内にゲッターも定義しました。

ルートの定義

ルートを作成する前に、ルートを定義し、ルートにアタッチされる対応するミドルウェアを関連付ける必要があります。

/login は認証されたユーザーを除くすべてのユーザーがアクセスできます。認証されたユーザーがこのルートにアクセスすると、ダッシュボード ルートにリダイレクトされる必要があります。このルートにはゲストミドルウェアが接続されている必要があります。

認証されたユーザーのみが /dashboard にアクセスできます。それ以外の場合、ユーザーはこのルートにアクセスするときに /login ルートにリダイレクトされる必要があります。このルートに認証ミドルウェアを関連付けます。

認証され、登録されたユーザーのみが /dashboard/movies にアクセスできます。このルートは、isSubscribed および auth ミドルウェアによって保護されています。

ルートの作成

次に、src ディレクトリに router フォルダーを作成し、そのフォルダーに router.js ファイルを作成します。次のコードを使用してファイルを編集します。

'vue' から Vue をインポートします
'vue-router' から Router をインポートします。
'../store' からストアをインポートします

'../components/Login' からログインをインポートします
'../components/Dashboard' からダッシュボードをインポートします
'../components/Movies' から Movies をインポートします


Vue.use(ルーター)

const router = 新しいルーター({
    モード: '履歴'、
    ベース: process.env.BASE_URL、
    ルート: [
        {
            パス: '/login',
            名前: 'ログイン',
            コンポーネント: ログイン
        },

        {
            パス: '/dashboard',
            名前: 'ダッシュボード'、
            コンポーネント: ダッシュボード、
            子供たち: [{
                パス: '/dashboard/movies',
                名前: 'dashboard.movi​​es',
                コンポーネント: 映画
            }
        ]、
        }
    ]
})


デフォルトルーターをエクスポートする

ここでは、新しいルーター インスタンスを作成し、いくつかの構成オプションと、以前に定義したすべてのルートを取得するルート プロパティを渡します。これらのルートは現在保護されていないことに注意してください。この問題はすぐに修正されます。

次に、ルートを挿入して Vue インスタンスに保存します。次のコードを使用して src/main.js ファイルを編集します。

'vue' から Vue をインポートします
'./App.vue' からアプリをインポートします。
'./router/router' からルーターをインポートします
'./store' からストアをインポートします

Vue.config.productionTip = false


新しいVue({
  ルーター、
  店、
  レンダリング: h => h(App),
}).$mount('#app')

ミドルウェアの作成

src/router ディレクトリにミドルウェア フォルダーを作成し、そのフォルダーに guest.js、auth.js、および IsSubscribed.js ファイルを作成します。 guest.js ファイルに次のコードを追加します。

エクスポートデフォルト関数ゲスト({ next, store }){
    ストアの認証がログインしている場合
        次を返す({
           名前: 'ダッシュボード'
        })
    }
   
    次を返す()
   }

ゲスト ミドルウェアは、ユーザーが認証されているかどうかを確認します。認証が成功すると、ダッシュボード パスにリダイレクトされます。

次に、次のコードを使用して auth.js ファイルを編集します。

デフォルトの関数 auth ({ next, store }) をエクスポートします。
 (!store.getters.auth.loggedIn)の場合{
     次を返す({
        名前: 'ログイン'
     })
 }

 次を返す()
}

認証ミドルウェアでは、ストアを使用して、ユーザーが現在認証されているかどうかを確認します。ユーザーがすでにログインしているかどうかに応じて、リクエストを続行するか、ログイン ページにリダイレクトします。

次のコードを使用して isSubscribed.js ファイルを編集します。

エクスポートデフォルト関数isSubscribed({ next, store }){
    サブスクライブされている場合
        次を返す({
           名前: 'ダッシュボード'
        })
    }
   
    次を返す()
   }

isSubscribed のミドルウェアは、auth ミドルウェアに似ています。ユーザーが登録しているかどうかを確認するためにストアを使用します。ユーザーがサブスクライブしている場合は、期待されるルートにアクセスできます。そうでない場合は、ダッシュボード ページにリダイレクトされます。

ルートの保護

すべてのミドルウェアが作成されたので、それらを使用してルートを保護しましょう。次のコードを使用して src/router/router.js ファイルを編集します。

'vue' から Vue をインポートします
'vue-router' から Router をインポートします。
'../store' からストアをインポートします

'../components/Login' からログインをインポートします
'../components/Dashboard' からダッシュボードをインポートします
'../components/Movies' から Movies をインポートします

'./middleware/guest' からゲストをインポートします。
'./middleware/auth' から auth をインポートします。
'./middleware/isSubscribed' から isSubscribed をインポートします。

Vue.use(ルーター)

const router = 新しいルーター({
    モード: '履歴'、
    ベース: process.env.BASE_URL、
    ルート: [{
            パス: '/login',
            名前: 'ログイン',
            コンポーネント: ログイン、
            メタ: {
                ミドルウェア:
                    ゲスト
                ]
            }
        },
        {
            パス: '/dashboard',
            名前: 'ダッシュボード'、
            コンポーネント: ダッシュボード、
            メタ: {
                ミドルウェア:
                    認証
                ]
            },
            子供たち: [{
                パス: '/dashboard/movies',
                名前: 'dashboard.movi​​es',
                コンポーネント: 映画、
                メタ: {
                    ミドルウェア:
                        認証、
                        購読済み
                    ]
                }
            }],
        }
    ]
})

デフォルトルーターをエクスポートする

ここでは、すべてのミドルウェアをインポートし、ミドルウェアの配列を含む各ルートのメタ フィールドを定義しました。ミドルウェア配列には、特定のルートに関連付けるすべてのミドルウェアが含まれます。

Vue ルーティング ナビゲーション ガード

ルートを保護するために、Vue Routerが提供するナビゲーションガード[5]を使用します。これらのナビゲーション ガードは、ルートをリダイレクトまたはキャンセルすることでルートを保護します。

ガードのうちの 1 つはグローバル ガードです。これは通常、ルートがトリガーされる前に呼び出されるフックです。グローバル ガードを登録するには、ルーター インスタンスで beforeEach メソッドを定義する必要があります。

const router = 新しい Router({...})
router.beforeEach((to, from, next) => {
 //フックを解決するために必要なロジック
})

beforeEach メソッドは次の 3 つのパラメータを受け取ります。

to: これはアクセスする予定のルートです。

出典: これが現在のルートです。

next: これはフックを呼び出す関数です。

ミドルウェアの実行

beforeEach フックを使用してミドルウェアを実行できます。

const ルーター = 新しいルーター({...})

router.beforeEach((to, from, next) => {
    if (!to.meta.middleware) {
        次を返す()
    }
    const ミドルウェア = to.meta.middleware

    定数コンテキスト = {
        に、
        から、
        次、
        店
    }
    ミドルウェア[0]を返す({
        ...コンテクスト
    })
})

まず、現在処理中のルートにミドルウェア属性を含むメタ フィールドがあるかどうかを確認します。ミドルウェア属性が見つかった場合、それは const 変数に割り当てられます。次に、各ミドルウェアに渡す必要があるすべてのものが含まれるコンテキスト オブジェクトを定義します。次に、ミドルウェア配列の最初のミドルウェアを関数として呼び出し、コンテキスト オブジェクトを渡します。

/dashboard ルートにアクセスしてみると、ログイン ルートにリダイレクトされるはずです。これは、/src/store.js の store.state.user.loggedIn プロパティが false に設定されているためです。 store.state.user.loggedIn プロパティを true に変更すると、/dashboard ルートにアクセスできるようになります。

現在、ミドルウェアは動作していますが、これは私たちが望んでいる動作ではありません。私たちの目標は、特定のパスに対して複数のミドルウェアを実行できるパイプラインを実装することです。

ミドルウェア[0]({ …context} "0") を返す
上記のコード ブロックでは、メタ フィールドのミドルウェア配列から渡された最初のミドルウェアのみを呼び出していることに注意してください。では、配列に含まれる他のミドルウェア (存在する場合) も呼び出されるようにするにはどうすればよいでしょうか?ここでパイプが役に立ちます。

パイプラインを作成する

src/router ディレクトリに変更し、middlewarePipeline.js ファイルを作成します。ファイルに次のコードを追加します。

関数 middlewarePipeline (コンテキスト、ミドルウェア、インデックス) {
    const nextMiddleware = ミドルウェア[インデックス]

    if(!nextミドルウェア){
        コンテキストを返す.next 
    }

    戻り値 () => {
        const nextPipeline = ミドルウェアPipeline(
            コンテキスト、ミドルウェア、インデックス + 1
        )

        nextMiddleware({ ...コンテキスト、次: nextPipeline })

    }
}

デフォルトのミドルウェアパイプラインをエクスポートする

middlewarePipeline には 3 つのパラメータがあります。

context: これは先ほど作成したコンテキスト オブジェクトであり、スタック内の各ミドルウェアに渡すことができます。

middleware: これはルートのメタフィールドで定義されたミドルウェア配列そのものです。

index: これは、ミドルウェア配列内で実行する現在のミドルウェアのインデックスです。

const nextMiddleware = ミドルウェア[インデックス]
if(!nextミドルウェア){
コンテキストを返す.next
}

ここでは、middlewarePipeline 関数に渡されたインデックス内のミドルウェアを単純に抽出しています。インデックスにミドルウェアが見つからない場合は、デフォルトの次のコールバックが返されます。

戻り値 () => {
const nextPipeline = ミドルウェアPipeline(
コンテキスト、ミドルウェア、インデックス + 1
)
nextMiddleware({ ...コンテキスト、次: nextPipeline })
}

コンテキストを渡して nextMiddleware を呼び出し、次に nextPipeline const を呼び出します。 middlewarePipeline 関数は、インデックスを 1 に増やしながら、スタック内で実行する次のミドルウェアを取得するために自身を呼び出す再帰関数であることに注意してください。

すべてをまとめると

middlewarePipeline を使用しましょう。 src/router/router.js ファイルを次のように編集します。

'vue' から Vue をインポートします
'vue-router' から Router をインポートします。
'../store' からストアをインポートします

'../components/Login' からログインをインポートします
'../components/Dashboard' からダッシュボードをインポートします
'../components/Movies' から Movies をインポートします

'./middleware/guest' からゲストをインポートします。
'./middleware/auth' から auth をインポートします。
'./middleware/isSubscribed' から isSubscribed をインポートします。
'./middlewarePipeline' から middlewarePipeline をインポートします。

Vue.use(ルーター)

const router = 新しいルーター({
    モード: '履歴'、
    ベース: process.env.BASE_URL、
    ルート: [{
            パス: '/login',
            名前: 'ログイン',
            コンポーネント: ログイン、
            メタ: {
                ミドルウェア:
                    ゲスト
                ]
            }
        },
        {
            パス: '/dashboard',
            名前: 'ダッシュボード'、
            コンポーネント: ダッシュボード、
            メタ: {
                ミドルウェア:
                    認証
                ]
            },
            子供たち: [{
                パス: '/dashboard/movies',
                名前: 'dashboard.movi​​es',
                コンポーネント: 映画、
                メタ: {
                    ミドルウェア:
                        認証、
                        購読済み
                    ]
                }
            }],
        }
    ]
})

router.beforeEach((to, from, next) => {
    if (!to.meta.middleware) {
        次を返す()
    }
    const ミドルウェア = to.meta.middleware
    定数コンテキスト = {
        に、
        から、
        次、
        店
    }

    ミドルウェア[0]を返す({
        ...コンテクスト、
        次へ: middlewarePipeline(コンテキスト、ミドルウェア、1)
    })
})

デフォルトルーターをエクスポートする

ここでは、スタックに含まれる後続のミドルウェアを実行するために <code> middlewarePipeline <code> を使用します。

ミドルウェア[0]を返す({
...コンテクスト、
次へ: middlewarePipeline(コンテキスト、ミドルウェア、1)
})

最初のミドルウェアが呼び出された後、middlewarePipeline 関数を使用して、スタックに含まれる後続のミドルウェアも、利用できるミドルウェアがなくなるまで呼び出されます。

/dashboard/movies ルートにアクセスすると、/dashboard にリダイレクトされます。これは、ユーザーが現在認証されているものの、有効なサブスクリプションがないためです。ストア内の store.state.user.isSubscribed プロパティを true に設定すると、/dashboard/movies ルートにアクセスできるようになります。

要約する

ミドルウェアは、アプリケーション内のさまざまなルートを保護するのに最適な方法です。これは、複数のミドルウェアを使用して Vue アプリケーション内の単一のルートを保護する非常にシンプルな実装です。

Vue ミドルウェア パイプラインを 1 つの記事で学習するこの記事はこれで終わりです。より関連性の高い Vue ミドルウェア パイプラインのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

参照

[1] Vueルーター: https://router.vuejs.org/

[2] Vue CLI: https://cli.vuejs.org/

[3] Vueルーター: https://github.com/vuejs/vue-router/

[4] ヴュークス: https://vuex.vuejs.org/

[5] ナビゲーションガード: https://router.vuejs.org/guide/advanced/navigation-guards.html#global-before-guards

<<:  MySQLデータベースが大きすぎる場合にバックアップと復元を行う方法

>>:  MySQLデータベースのQPSとTPSの意味と計算方法

推薦する

Vueトップタグ閲覧履歴の実装

目次ナンセンス実装された機能文章要点ナンセンスデモプレビュー実装された機能デフォルトでホームページが...

ネイティブ JavaScript を使用して計算機のサンプル コードを開発する

計算機の主な機能は数値計算を実行することです。計算機機能の Web インスタンスを開発すると、js ...

MySQL実践スキル: 2つのテーブルに異なるデータがあるかどうかを比較する方法の分析

この記事では、MySQL が 2 つのテーブルを比較して、異なるデータがあるかどうかを確認する方法を...

マウスを動かしたときにセカンダリメニューバーを実装するために HTML+CSS を使用する例

この記事では、マウスを動かしたときにセカンダリ メニュー バーを実装するために HTML+CSS を...

Linuxルートの初期値を設定する方法の簡単な分析

Ubuntu ではデフォルトで root ログインが許可されていないため、初期の root アカウン...

Linuxにおけるumaskコマンドの使用原理と計算方法の詳しい解説

目次umask umaskの使用法原理1. umask値2. ファイルディレクトリの最大権限3. 従...

Vue ページ内の公開マルチタイプ添付画像アップロード領域と適用可能な折りたたみパネル (サンプルコード)

フロントエンド プロジェクトでは、添付ファイルのアップロードは非常に一般的な機能であり、ほぼすべての...

CSSでフレックス配置を表示する(レイアウトツール)

display: flex レイアウトに関しては、深く理解している人もいますし、私も他の人の作業か...

KVM 仮想化のインストール、展開、管理のチュートリアル

目次1.kvmの展開1.1 kvmのインストール1.2 kvm Web管理インターフェースのインスト...

js を使用して年カルーセル選択効果をネイティブに実装する例

序文js を使用して、年の回転選択効果を実現します。では早速、写真を見てみましょう。 1. アイデア...

webpack-dev-server のコア概念とケースの詳細な説明

webpack-dev-server コアコンセプトWebpack の ContentBase と ...

MySQL で数千万のテストデータを含むテストデータベースを作成する方法

場合によっては、MySQL が公式に提供しているテスト ライブラリに基づいてテスト データを作成し、...

JS初心者が配列を処理するための実践的な方法のまとめ

join() メソッド: 指定された区切り文字を使用して配列内のすべての要素を文字列に接続します。例...

イメージの起動時にdocker runまたはdocker restartが自動的に終了する問題を解決します

コマンドを実行します: docker run --name centos8 -d centos /b...

TCPソケットSYNキューとAcceptキューの差異分析

まず、「LISTENING」状態の TCP ソケットには 2 つの独立したキューがあることを理解する...