NUXT3学习日记四(路由中间件、导航守卫)

前言

Nuxt 3 中,中间件(Middleware)是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑,像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用,也可以只在特定页面或布局中使用。

中间件必须在文件夹middleware中,在这个middleware文件夹中创建js文件

中间件的作用

  • 身份验证:用于检查用户是否登录或是否有权限访问某些页面。
  • 重定向:根据条件自动重定向用户到另一个页面。
  • 条件加载数据:在路由切换前加载或检查数据。
  • 页面控制:控制哪些页面可以访问,哪些不能。
  • 日志记录:记录访问的路径、时间等信息。

普通中间件

以下就是一个中间件代码:

middleware/my.jsexport default defineNuxtRouteMiddleware((to, from) => {console.log(to.path)if (to.path === '/about') {console.log('www');//必须加return,否则不能跳转return navigateTo('/login')//返回true这放行,后面的中间件也会执行// return true}
})

在这段代码中,to是去哪,from是从哪里来。

另外这里提醒一下,拦截跳转路由记得需要加上return,否则跳转不起作用。

在vue文件中使用中间件,两种方式,一种是单独提出来在middleware文件夹中定义中间件,另外一种就是在vue文件中直接定义。

这里我推荐官方的第一种,在middleware文件夹中定义中间件:

//about.vue<template><div></div>
</template><script setup>
definePageMeta({/*** 路由中间件1*/middleware:['my']/*************************************************//*** 路由中间件2*/// middleware:[//   function(to,from){//     console.log(to.path);//   }// ]
});
</script><style scoped>
</style>

注意!!!   这里middleware是个数组,在middleware文件夹中定义的js文件名字就是数组的元素。

例如:

那么有多个中间件,执行顺序是什么样的呢?

这里就按照数组中元素的顺序执行中间件

下面来验证一下

我们修改一下my.js中的代码:

export default defineNuxtRouteMiddleware((to, from) => {console.log(to.path)if (to.path === '/about') {//返回true这放行,后面的中间件也会执行return true}
})

这里如果想要让后续的中间件起作用,我们需要return一个true。

这里如果return的是false,服务端渲染就会返回404。

my_two.js中的代码:

export default defineNuxtRouteMiddleware((to, from) => {console.log(to.path)if (to.path === '/about') {//必须加return,否则不能跳转return navigateTo('/login')}
})

下面请看输出结果:

可以看出先执行my.js中的代码,然后执行my_two.js中的代码。

 全局中间件

注意,全局中间件的文件名必须以‘global.js’结尾,例如test.global.js文件。

我们的全局中间件直接编写不用我们自己去引入就可以起作用。

如果middleware文件夹中有多个全局中间件,根据文件名ascll(阿斯克码)从小到大排序执行。

//全局中间件,拦截所有的请求,所以在about.vue中先输出“/about”,
//跳转到login.vue中输出“/login”//如果有多个全局中间件,根据ascll(阿斯克码)从小到大排序执行
export default defineNuxtRouteMiddleware((to, from) => {console.log(to.path)if (to.path === '/about') {return navigateTo('/login')}
})

输出结果为:

这里呢,我们首先跳转到about页面,被全局中间件进行拦截,紧接着进入到login页面再次被拦截,所以先输出/about再输出/login。 

全局路由守卫

此时在客户端跳转没有问题,在服务端渲染报500错误,因为服务端没有token或ElMessage。

在之后会使用pinia进行解决,本章先看其他办法。

//全局中间件,拦截所有的请求,所以在about.vue中先输出“/about”,
//跳转到login.vue中输出“/login”//如果有多个全局中间件,根据ascll(阿斯克码)从小到大排序执行
export default defineNuxtRouteMiddleware((to, from) => {/*** 路由守卫*///此时访问客户端正常执行//直接访问服务端,报500错误,因为没有tokenlet passURL = ['/','/login','/about','/index']if (!passURL.includes(to.path)) {let token = localStorage.getItem('token')if (!token) {ElMessage.error('请先登录')return navigateTo('/login')}}
})

不知道大家有没有发现,我们nuxt3是先去执行一下服务端而后执行客户端代码,所以我们需要给上面代码加一个判断。如下所示:

//全局中间件,拦截所有的请求,所以在about.vue中先输出“/about”,
//跳转到login.vue中输出“/login”//如果有多个全局中间件,根据ascll(阿斯克码)从小到大排序执行
export default defineNuxtRouteMiddleware((to, from) => {/*** 路由守卫*/let passURL = ['/','/login','/about','/index']if (!passURL.includes(to.path)) {let token = ''if (import.meta.client) {token = localStorage.getItem('token')}if (!token) {return navigateTo('/login')}}
})

这样无论去访问路由地址(服务端渲染),还是在客户端点击进行跳转,都会成功执行代码,实现路由守卫。但是这样就没有用户提示了,体验感很差,您请往下看。

//全局中间件,拦截所有的请求,所以在about.vue中先输出“/about”,
//跳转到login.vue中输出“/login”//如果有多个全局中间件,根据ascll(阿斯克码)从小到大排序执行
export default defineNuxtRouteMiddleware((to, from) => {/*** 路由守卫*///此时访问客户端正常执行//直接访问服务端,报500错误,因为没有tokenlet passURL = ['/','/login','/about','/index']if (!passURL.includes(to.path)) {let token = ''if (import.meta.client) {token = localStorage.getItem('token')}if (!token) {return navigateTo({path:'/login',query:{code:401,message:'没有token,请先登录'}})}}
})
<template><div><p>登录页面</p></div>
</template><script setup>
onMounted(() => {const route = useRoute();if (route.query.code) {ElMessage.error(route.query.code + "" + route.query.message);}
});
</script><style scoped>
</style>

得到的效果如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力

故障现象  一辆2012款路虎揽胜运动版车&#xff0c;搭载3.0T柴油发动机&#xff08;型号为306DT&#xff09;&#xff0c;累计行驶里程约为10.2万km。车主进厂反映&#xff0c;车辆行驶中加速无力&#xff0c;且发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;发动…

网络安全与加密

1.Base64简单说明描述&#xff1a;Base64可以成为密码学的基石&#xff0c;非常重要。特点&#xff1a;可以将任意的二进制数据进行Base64编码结果&#xff1a;所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符&#xff1a;A~Z a~z 0~9 / 对文件进行base64编码…

C语言:数组转换指针的时机

1、指针数组 如果一个数组中的所有元素保存的都是指针&#xff0c;那么我们就称它为指针数组&#xff0c;指针数组的定义形式一般为&#xff1a; dataType *arrayName[length];[ ]的优先级高于*&#xff0c;该定义形式应该理解为&#xff1a; dataType *(arrayName[length])…

UE5 DownloadImage加载jpg失败的解决方法

DownloadImage加载jpg失败的解决方法 现象解决方案具体方法 现象 用UE自带的 DownloadImage 无法下载成功&#xff0c;从 failure 引脚出来。 接入一个由监控器自动保存起的图像&#xff0c;有些可以正常加载成功&#xff0c;有些无法加载成功。 经调查问题出现在&#xff0c;…

使用 helm 部署 gitlab

一、下载 Gitlab chart 进入 artifacthub 官网 选择你想要的版本&#xff08;我选择的chart版本是 8.4.0 , gitlab 版本是17.4.0 &#xff09; 进入到控制台&#xff0c;添加helm仓库 如果你想不改任何配置&#xff0c;你可以执行安装命令&#xff0c;等待安装即可helm instal…

FreeRTOS信号量(一)

目录 什么是信号量&#xff1f; 1.信号量简介 2.二值信号量 2.1二值信号量简介 1. 首先&#xff0c;创建时&#xff0c;二值信号量默认无效 2. 之后中断释放信号量 3.信号量获取成功 4、任务再次进入阻塞态 2.2 创建二值信号量 1、函数vSemaphoreCreateBinary () 2、…

51单片机-独立按键与数码管联动

独立键盘和矩阵键盘检测原理及实现 键盘的分类&#xff1a;编码键盘和非编码键盘 键盘上闭合键的识别由专用的硬件编码器实现&#xff0c;并产生键编码号或键值的称为编码键盘&#xff0c;如&#xff1a;计算机键盘。靠软件编程识别的称为非编码键盘&#xff1b;在单片机组成…

springboot课程答疑系统(代码+数据库+LW)

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了一个计算机管理课程答疑系统的方案。文章…

解锁业务成功:大数据和 AI 如何协作以释放战略洞察

在当今这个数据主导的时代&#xff0c;大数据与AI的协同作用对于寻求竞争优势的组织而言愈发关键。大数据以其庞大的数据量、多样化的数据类型以及高速的数据生成能力&#xff0c;为AI算法提供了丰富的原材料&#xff0c;助力其挖掘出有价值的洞见&#xff0c;推动明智决策的制…

24.UE5枚举,怪物分类,龙卷风技能

2-26 枚举、怪物分类、龙旋风技能、掉落概率_哔哩哔哩_bilibili 目录 1.枚举 1.1枚举类型的创建 1.2 将枚举类型绑定到怪物蓝图上 1.3枚举类型的使用 1.3.1创建新的掉落物 1.3.2更改怪物掉落逻辑 2.龙卷风技能 2.1输入映射 2.2龙卷风发射物的创建 2.3龙卷风伤害逻辑…

故障字故障码 简单介绍

一、故障字 1.1故障字的概念 故障字&#xff08;Fault Word&#xff09;是一种常用的技术术语&#xff0c;主要应用在工业控制、嵌入式系统和通信领域&#xff0c;用于表示系统状态或故障信息。它是一个以位为单位的编码方式&#xff0c;每个位&#xff08;bit&#xff09;对应…

鸿蒙系统ubuntu开发环境搭建

在RISC-V等平台移植鸿蒙系统OpenHarmony&#xff0c;需要使用linux环境进行代码的编译&#xff0c;为兼顾日常办公需要&#xff0c;可采用WindowsUbuntu虚拟机的混合开发的环境&#xff0c;通过网络及文件夹共享&#xff0c;在主机和虚拟机之间共享文件数据。 工具准备&#x…

二叉树oj题解析

二叉树 二叉树的最近公共祖先什么是最近公共祖先&#xff1f;leetcode中求二叉树中最近公共祖先解题1.解题2. 根据二叉树创建字符串 二叉树的最近公共祖先 什么是最近公共祖先&#xff1f; 最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节…

优先算法 —— 双指针系列 - 移动零

1. 移动零 题目链接&#xff1a; 283. 移动零 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/move-zeroes/description/ 2. 算法原理 其实像移动零这种类型的题目都有一个名字叫做数组划分&#xff08;数组分块&#xff09;&#xff0c;就是说先给一个…

C语言——数组逐元素操作练习

定义一个能容纳10个元素的整形数组a&#xff0c;从键盘读取9个整数存放到前9个数组元素中。 一. 从键盘读取一个整数n和位置p(0<p<8)&#xff0c;插入n到数组a中&#xff0c;插入位置&#xff1a;下标p。要求插入点及后续的数组元素都要后移动。 代码如下&#xff1a; …

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 实用效果&#xff1a; 缺陷是只能一个一个单独上传

图算法 | 3、图分析与数据科学

图分析(Graph Analytics)在本质上是对图数据的处理与分析&#xff0c;其过程可以概括为图计算。 而图计算的范畴不仅包含数据的计算或分析&#xff0c;还包含元数据管理、模式管理、数据建模、数据清洗、转换、加载、治理、图分析与计算等一系列操作。 或许我们用大数据生命周…

66 mysql 的 表自增长锁

前言 mysql 的表锁之 AUTO_INC, 是我们自增长的时候做并发控制的锁 主要是用于 自增长生成新的 id 的时候的控制 在前面的文档中, 我们又看到 mysql 这边自增长的处理的相关的大概脉络 但是 对于一些 并发控制的细节, 我们当时 应该是直接忽略掉了 我们这里就来看一下…