返回顶部
首页 > 资讯 > 精选 >Vue中间件管道如何应用
  • 951
分享到

Vue中间件管道如何应用

2023-07-04 14:07:18 951人浏览 安东尼
摘要

这篇文章主要介绍“Vue中间件管道如何应用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中间件管道如何应用”文章能帮助大家解决问题。什么是中间件管道?中间件管道(middleware pipe

这篇文章主要介绍“Vue中间件管道如何应用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中间件管道如何应用”文章能帮助大家解决问题。

什么是中间件管道?

中间件管道(middleware pipeline) 是一堆彼此并行运行的不同的中间件。

继续前面的案例,假设在 /dashboard/movies 上有另一个路由,我们只希望订阅用户可以访问。我们已经知道要访问 dashboard 路由,你需要进行身份验证。那么应该怎样保护  /dashboard/movies  路由以确保只有经过身份验证和订阅的用户才能访问呢?通过使用中间件管道,可以将多个中间件链接在一起并确保它们能够并行运行。

开始

首先用 Vue CLI[2] 快速构建一个新的 Vue 项目

vue create vue-middleware-pipeline

安装依赖项

创建并安装项目目录后,切换到新创建的目录并从终端运行以下命令:

npm i vue-router vuex

Vue-router[3] — 是vue.js的官方路由器

Vuex[4] — 是 Vue 的状态管理库

创建组件

我们的程序将包含三个组件。

Login — 此组件展示给尚未通过身份验证的用户。

Dashboard — 此组件展示给已登录的用户。

Movies — 我们会向已登录并拥有有效订阅的用户显示此组件。

让我们创建这些组件。切换到 src/components 目录并创建以下文件:Dashboard.vue、Login.vue和Movies.vue

使用以下代码编辑 Login.vue 文件:

<template>  <div>    <p>This is the Login component</p>  </div></template>

使用以下代码编辑 Dashboard.vue 文件:

<template>  <div>    <p>This is the Dashboard component for authenticated users</p>    <router-view/>  </div></template>

最后,将以下代码添加到 Movies.vue 文件中:

<template>  <div>    <p>This is the Movies component for authenticated and subscribed users</p>  </div></template>

创建store

就 Vuex 而言,store 只是一个用于保存我们程序状态的容器。它允许我们确定用户是否经过身份验证以及检查用户是否已订阅。

在 src 文件夹中,创建一个 store.js 文件并将以下代码添加到该文件中:

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({    state: {        user: {            loggedIn: false,            isSubscribed: false        }    },    getters: {        auth(state) {            return state.user        }    }})

store 在其 状态 内包含一个 user 对象。user 对象包含 loggedIn 和 isSubscribed 属性,它可以帮助我们确定用户是否已登录并具有有效订阅。我们还在 store 中定义了一个 getter 来返回 user 对象。

定义路由

在创建路由之前,应该先定义它们,并关联将要附加到其上的对应的中间件。

除了通过身份验证的用户之外,每个人都可以访问 /login。当通过身份验证的用户访问此路由时,应重定向到 dashboard 路由。这条路由应该附有一个 guest 中间件。

只有通过身份验证的用户才能访问 /dashboard。否则用户在访问此路由时应重定向到 /login 路由。我们把 auth 中间件与此路由相关联。

只有通过身份验并订阅的用户才能访问 /dashboard/movies。该路由受到 isSubscribed和 auth 中间件的保护。

创建路由

接下来,在 src 目录中创建一 个router 文件夹,然后在该文件夹中创建一个 router.js 文件。使用以下代码编辑文件:

import Vue from 'vue'import Router from 'vue-router'import store from '../store'import Login from '../components/Login'import Dashboard from '../components/Dashboard'import Movies from '../components/Movies'Vue.use(Router)const router = new Router({    mode: 'history',    base: process.env.BASE_URL,    routes: [        {            path: '/login',            name: 'login',            component: Login        },        {            path: '/dashboard',            name: 'dashboard',            component: Dashboard,            children: [{                path: '/dashboard/movies',                name: 'dashboard.movies',                component: Movies            }        ],        }    ]})export default router

在这里,我们创建了一个新的 router 实例,同时传递了几个配置选项以及一个 routes 属性,它接受我们之前定义的所有路由。要注意目前这些路由还都是不受保护的。我们很快就会解决这个问题。

接下来将路由和 store 注入Vue 实例。使用以下代码编辑 src/main.js 文件:

import Vue from 'vue'import App from './App.vue'import router from './router/router'import store from './store'Vue.config.productionTip = falsenew Vue({  router,  store,  render: h => h(App),}).$mount('#app')

创建中间件

在 src/router 目录中创建一个 middleware 文件夹,然后在该文件夹下创建 guest.js,auth.js和IsSubscribed.js文件。将以下代码添加到 guest.js 文件中:

export default function guest ({ next, store }){    if(store.getters.auth.loggedIn){        return next({           name: 'dashboard'        })    }       return next()   }

guest 中间件检查用户是否通过了身份验证。如果通过了身份验证就会被重定向到 dashboard 路径。

接下来,用以下代码编辑 auth.js 文件:

export default function auth ({ next, store }){ if(!store.getters.auth.loggedIn){     return next({        name: 'login'     }) } return next()}

在 auth 中间件中,我们用 store 检查用户当前是否已经 authenticated。根据用户是否已经登录,我们要么继续请求,要么将其重定向到登录页面。

使用以下代码编辑 isSubscribed.js 文件:

export default function isSubscribed ({ next, store }){    if(!store.getters.auth.isSubscribed){        return next({           name: 'dashboard'        })    }       return next()   }

isSubscribed 中的中间件类似于 auth 中间件。我们用 store检查用户是否订阅。如果用户已订阅,那么他们可以访问预期路由,否则将其重定向回 dashboard 页面。

保护路由

现在已经创建了所有中间件,让我们利用它们来保护路由。使用以下代码编辑 src/router/router.js 文件:

import Vue from 'vue'import Router from 'vue-router'import store from '../store'import Login from '../components/Login'import Dashboard from '../components/Dashboard'import Movies from '../components/Movies'import guest from './middleware/guest'import auth from './middleware/auth'import isSubscribed from './middleware/isSubscribed'Vue.use(Router)const router = new Router({    mode: 'history',    base: process.env.BASE_URL,    routes: [{            path: '/login',            name: 'login',            component: Login,            meta: {                middleware: [                    guest                ]            }        },        {            path: '/dashboard',            name: 'dashboard',            component: Dashboard,            meta: {                middleware: [                    auth                ]            },            children: [{                path: '/dashboard/movies',                name: 'dashboard.movies',                component: Movies,                meta: {                    middleware: [                        auth,                        isSubscribed                    ]                }            }],        }    ]})export default router

在这里,我们导入了所有中间件,然后为每个路由定义了一个包含中间件数组的元字段。中间件数组包含我们希望与特定路由关联的所有中间件。

Vue 路由导航守卫

我们使用 Vue Router 提供的导航守卫[5]来保护路由。这些导航守卫主要通过重定向或取消路由的方式来保护路由。

其中一个守卫是全局守卫,它通常是在触发路线之前调用的钩子。要注册一个全局的前卫,需要在 router 实例上定义一个 beforeEach 方法。

const router = new Router({ ... })router.beforeEach((to, from, next) => { //necessary logic to resolve the hook})

beforeEach 方法接收三个参数:

to: 这是我们打算访问的路由。

from: 这是我们目前的路由。

next: 这是调用钩子的 function。

运行中间件

使用 beforeEach 钩子可以运行我们的中间件。

const router = new Router({ ...})router.beforeEach((to, from, next) => {    if (!to.meta.middleware) {        return next()    }    const middleware = to.meta.middleware    const context = {        to,        from,        next,        store    }    return middleware[0]({        ...context    })})

我们首先检查当前正在处理的路由是否有一个包含 middleware 属性的元字段。如果找到 middleware 属性,就将它分配给 const 变量。接下来定义一个 context 对象,其中包含我们需要传递给每个中间件的所有内容。然后,把中间件数组中的第一个中间件做为函数去调用,同时传入 context 对象。

尝试访问 /dashboard 路由,你应该被重定向到 login 路由。这是因为 /src/store.js 中的 store.state.user.loggedIn 属性被设置为 false。将 store.state.user.loggedIn 属性改为 true,就应该能够访问 /dashboard 路由。

现在中间件正在运行,但这并不是我们想要的方式。我们的目标是实现一个管道,可以针对特定路径运行多个中间件。

return middleware[0]({ …context} "0")
注意上面代码块中的这行代码,我们只调用从 meta 字段中的中间件数组传递的第一个中间件。那么我们怎样确保数组中包含的其他中间件(如果有的话)也被调用呢?这就是管道派上用场的地方。

创建管道

切换到 src/router 目录,然后创建一个 middlewarePipeline.js 文件。将以下代码添加到文件中:

function middlewarePipeline (context, middleware, index) {    const nextMiddleware = middleware[index]    if(!nextMiddleware){        return context.next     }    return () => {        const nextPipeline = middlewarePipeline(            context, middleware, index + 1        )        nextMiddleware({ ...context, next: nextPipeline })    }}export default middlewarePipeline

middlewarePipeline 有三个参数:

context:  这是我们之前创建的 context 对象,它可以传递给栈中的每个中间件。

middleware: 这是在 route 的 meta 字段上定义的middleware 数组本身。

index: 这是在 middleware 数组中运行的当前中间件的 index。

const nextMiddleware = middleware[index]if(!nextMiddleware){return context.next}

在这里,我们只是在传递给 middlewarePipeline 函数的 index 中拔出中间件。如果在 index 没有找到 middleware,则返回默认的 next 回调。

return () => {const nextPipeline = middlewarePipeline(context, middleware, index + 1)nextMiddleware({ ...context, next: nextPipeline })}

我们调用 nextMiddleware 来传递 context, 然后传递 nextPipeline const。值得注意的是,middlewarePipeline 函数是一个递归函数,它将调用自身来获取下一个在堆栈中运行的中间件,同时将index增加为1。

把它们放在一起

让我们使用middlewarePipeline。像下面这段代码一样编辑 src/router/router.js 文件:

import Vue from 'vue'import Router from 'vue-router'import store from '../store'import Login from '../components/Login'import Dashboard from '../components/Dashboard'import Movies from '../components/Movies'import guest from './middleware/guest'import auth from './middleware/auth'import isSubscribed from './middleware/isSubscribed'import middlewarePipeline from './middlewarePipeline'Vue.use(Router)const router = new Router({    mode: 'history',    base: process.env.BASE_URL,    routes: [{            path: '/login',            name: 'login',            component: Login,            meta: {                middleware: [                    guest                ]            }        },        {            path: '/dashboard',            name: 'dashboard',            component: Dashboard,            meta: {                middleware: [                    auth                ]            },            children: [{                path: '/dashboard/movies',                name: 'dashboard.movies',                component: Movies,                meta: {                    middleware: [                        auth,                        isSubscribed                    ]                }            }],        }    ]})router.beforeEach((to, from, next) => {    if (!to.meta.middleware) {        return next()    }    const middleware = to.meta.middleware    const context = {        to,        from,        next,        store    }    return middleware[0]({        ...context,        next: middlewarePipeline(context, middleware, 1)    })})export default router

在这里,我们使用 <code> middlewarePipeline <code>来运行栈中包含的后续中间件。

return middleware[0]({...context,next: middlewarePipeline(context, middleware, 1)})

在调用第一个中间件之后,使用 middlewarePipeline 函数,还会调用栈中包含的后续中间件,直到不再有中间件可用。

如果你访问 /dashboard/movies 路由,应该被重定向到 /dashboard。这是因为 user 当前是 authenticated 但没有有效订阅。如果将 store 中的 store.state.user.isSubscribed 属性设置为 true,就应该可以访问 /dashboard/movies 路由了。

vue是什么

Vue是一套用于构建用户界面的渐进式javascript框架,Vue与其它大型框架的区别是,使用Vue可以自底向上逐层应用,其核心库只关注视图层,方便与第三方库和项目整合,且使用Vue可以采用单文件组件和Vue生态系统支持的库开发复杂的单页应用。

关于“Vue中间件管道如何应用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Vue中间件管道如何应用

本文链接: https://lsjlt.com/news/345863.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue中间件管道如何应用
    这篇文章主要介绍“Vue中间件管道如何应用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中间件管道如何应用”文章能帮助大家解决问题。什么是中间件管道?中间件管道(middleware pipe...
    99+
    2023-07-04
  • 一篇文章学会Vue中间件管道
    通常,在构建SPA时,需要保护某些路由。例如假设有一个只允许经过身份验证的用户访问的 dashboard 路由,我们可以通过使用 auth 中间件来确保合法用户才能访问它。 在本教程...
    99+
    2024-04-02
  • ASP.NET Core的中间件与管道介绍
    今天来讨论一个ASP.NET Core 很重要概念管道和中间件,在ASP.NET Core中,针对HTTP请求采用pipeline也就是通常说的管道方式来处理,而管道容器内可以挂载很...
    99+
    2024-04-02
  • C++中如何使用管道实现进程间通信
    在C++中使用管道实现进程间通信可以通过以下步骤: 包含相关的头文件: #include <iostream> #i...
    99+
    2024-04-02
  • golang管道如何用于函数间通信
    管道在 go 语言中是一种无缓冲通道,用于在 goroutine 之间传输数据。它允许 goroutine 异步通信,提高程序效率和可扩展性。管道可以用于写入和读取数据,使用 Go ...
    99+
    2024-05-02
    golang 管道
  • VUE Nuxt.js中间件最佳实践:如何正确使用中间件
    1. 什么是中间件? 中间件是Vue Nuxt.js中的一种钩子函数,它可以在请求到达路由处理程序之前执行某些操作。中间件可以用于各种目的,例如: 身份验证:检查用户是否已登录,并拒绝未登录用户的访问。 授权:检查用户是否有权访问请求...
    99+
    2024-02-04
    Vue Nuxt.js 中间件 最佳实践
  • 如何在 Golang 中使用管道实现文件读写?
    通过管道进行文件读写:创建一个管道从文件读取数据并通过管道传递从管道中接收数据并处理将处理后的数据写入文件使用 goroutine 并发执行这些操作以提高性能 如何在 Golang 中...
    99+
    2024-05-15
    golang 管道 文件读写
  • ASP.NET Core中间件与管道的概念是什么
    今天小编给大家分享一下ASP.NET Core中间件与管道的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-26
  • 如何在Shell脚本中使用管道
    如何在Shell脚本中使用管道?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。示例1:生成一个8位的随机密码tr -dc A-Za-z0-9_...
    99+
    2023-06-09
  • 如何在LINUX中使用管道命令
    如何在LINUX中使用管道命令?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。打开LINUX,我们可以选用UBUNTU操作系统。找到左边的TERMINAL,并且打开窗口。|前...
    99+
    2023-06-13
  • Redis在PHP应用中的管道模式
    Redis是一个高效的内存数据库,提供了多种数据结构和丰富的功能。在PHP应用程序中,Redis也是非常流行的工具之一。其中,管道模式是一种Redis的优化技术,可以显著提高Redis的处理性能和效率。管道模式的原理是将多个Redis操作一...
    99+
    2023-05-15
    PHP redis 管道模式
  • MongoDB中如何操作管道操
    MongoDB中如何操作管道操,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。$matchmatch中都可以使用,比如获取集合中所有author为”杜甫”的文档,如下:db....
    99+
    2023-06-19
  • 如何在go和c#控制台应用程序之间建立长期管道连接
    php小编新一为您介绍如何在Go和C#控制台应用程序之间建立长期管道连接。在开发跨平台应用程序时,Go和C#是两种常用的编程语言。建立管道连接可以实现两种语言之间的通信和数据交换。本文...
    99+
    2024-02-14
    跨平台应用
  • Vue中$emit $refs子父组件间方法如何调用
    这篇文章将为大家详细讲解有关Vue中$emit $refs子父组件间方法如何调用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、$emit子组件调用父组件的方法并传递数...
    99+
    2024-04-02
  • vue中如何使用vue-resource插件
    vue中如何使用vue-resource插件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在使用这个插件之前,当然是先安装啦:npm ...
    99+
    2024-04-02
  • VB.NET中如何使用事件通道
    这期内容当中小编将会给大家带来有关VB.NET中如何使用事件通道,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#代码示例如下:public delegate void sh...
    99+
    2023-06-17
  • vue响应用户事件如何实现
    本篇内容介绍了“vue响应用户事件如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!需求:页面上的列表原先有3个,我们想点击一次添加一条...
    99+
    2023-07-04
  • vue项目中如何使用mock你知道吗
    目录第一步:第二步,在request.js中进行相关配置,request.js代码如下:第三步,在mock.js中进行相关配置,mock.js代码如下:第四步,在main.js中需引...
    99+
    2024-04-02
  • VUE Nuxt.js中间件:助力你的应用更上一层楼
    VUE Nuxt.js 中间件简介 VUE Nuxt.js 中间件是一个强大的工具,它可以帮助你增强应用的安全性、性能和可扩展性。中间件是一个在请求和响应之间运行的函数,它可以用来执行各种操作,例如: 身份验证:检查用户是否已登录,并...
    99+
    2024-02-14
    Vue Nuxt.js 中间件 安全性 性能 可扩展性
  • 如何使用Jenkins多分支管道
    如何使用Jenkins多分支管道,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Jenkins多分支管道是设计CI/CD工作流的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作