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

前言

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

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

中间件的作用

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

普通中间件

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

middleware/my.js

export 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错误,因为没有token
    let 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错误,因为没有token
    let 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>

得到的效果如下所示:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像

文章目录 应用快速部署NginxRedisMySQLTomcat 制作镜像镜像原理基于已有容器创建使用 Dockerfile 创建镜像指令说明构建应用创建 Dockerfile 文件创建镜像 应用快速部署 Nginx docker run -d -p 80:80 nginx使用浏览器访问虚拟机地址 Redis docker pull redis docker run --…

02微服务系统与设计(D1_走出微服务误区:避免从单体到分布式单体)

目录 学习前言 一、回顾&#xff1a;从单体到微服务到 Function 二、分布式单体 分布式单体起因之一&#xff1a;通过共享库和网络客户端访问分布式能力 分布式单体起因之二&#xff1a;简单用远程调用替代进程内方法调用 分布式单体起因小结 三、引入非侵入式方案&#…

WEB攻防-通用漏洞文件上传js验证mimeuser.ini语言特性

知识点&#xff1a; 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini妙用 4、文件上传-php语言特性 详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整型&#xff0c;二次渲染等 3、检…

鸿蒙学习高效开发与测试-集成开发环境(4)

文章目录 1、工程管理2、代码编辑3、界面预览4、编译构建5、代码调试6、性能调优7、设备模拟8、命令行工具9、端云一体化开发 HUAWEI DevEco Studio 是面向鸿蒙生态的集成开发环境&#xff0c;提供了一站式的鸿蒙生态应用、元服务开发能力&#xff0c;详细能力如图所示。 1、工…

基于yolov8、yolov5的茶叶等级检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;茶叶等级检测在茶叶生产、质量控制和市场销售中起着至关重要的作用&#xff0c;不仅能帮助相关部门实时监测茶叶质量&#xff0c;还为智能化检测系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的茶叶等级检测模型&#xff0c;该模…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

从 HTML 到 CSS:开启网页样式之旅(开篇之一)——CSS 初体验与网页样式新征程

从 HTML 到 CSS&#xff1a;开启网页样式之旅&#xff08;一&#xff09;——CSS 初体验与网页样式新征程 前言一、为什么需要 CSS&#xff1f;二、CSS的引用&#xff08;一&#xff09;行内样式&#xff08;二&#xff09;内部样式&#xff08;三&#xff09;外部样式&#xf…

Android音频采集

在 Android 开发领域&#xff0c;音频采集是一项非常重要且有趣的功能。它为各种应用程序&#xff0c;如语音聊天、音频录制、多媒体内容创作等提供了基础支持。今天我们就来深入探讨一下 Android 音频采集的两大类型&#xff1a;Mic 音频采集和系统音频采集。 1. Mic音频采集…

数据结构C语言描述4(图文结合)--栈的实现,中序转后序表达式的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

数据结构之一:复杂度

相关代码&#xff1a;SData/test_22/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 数据结构&#xff1a;在内存当中存储、组织数据的方式。&#xff08;顺序表、链表、栈、队列、树等&#xff09;。 算法&#xff1a;与数据结构配合使用&#xff0c;是对数据的处理。&#…

【鸿蒙技术分享:探索 HarmonyOS 开发之旅】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Houdini和Blender如何使用CPU云渲染

近期&#xff0c;渲染101云渲染农场在产品和服务方面进行了重要更新&#xff0c;进一步提升了我们平台的渲染能力和兼容性&#xff0c;助力各位用户高效完成创作。云渲码6666 渲染101云渲码6666 1. Houdini和Blender支持CPU云渲染 我们不断拓展云渲染的工具和平台支持&#x…

02 —— Webpack 修改入口和出口

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 修改入口 webpack.config.js &#xff08;放在项目根目录下&#xff09; module.exports {//entry设置入口起点的文件路径entry: ./path/to/my/entry/file.js, }; 修改出口 webpack.config.js const path r…

网络编程 作业1

1.c #include <myhead.h> #define IP "192.168.60.45" #define PORT 6666 #define BACKLOG 100 void fun(int sss) {if(sssSIGCHLD){while(waitpid(-1,NULL,0)>0);}} int main(int argc, const char *argv[]) {//1.捕获子进程退出时的信号if(signal(SIGCHL…

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是&#xff1a;请基于附件 1 中的数据以及你的团队收集的额外数据&#xff0c;分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素&#xff0c;预测未来三年中国宠物行业的发展。 第一个问题&#xff1a;分析中国宠物行业按宠物类型的发展…

外排序中的归并排序

外排序中的归并排序 7.11 外排序中的归并排序相关基础知识原理最终参考程序 7.11 外排序中的归并排序 外部排序&#xff1a;数据元素太多不能同时放在内存中&#xff0c;根据排序过程的要求不能在内外存之间移动数据的排序。&#xff08;下文也称外排序&#xff09; 例如 1 G…

wsl2中kali linux下的docker使用教程(教程总结)

一、前言 上一篇关于kali linux的文章是图形界面的配置&#xff0c;这里作者准备补充两点&#xff0c;一点是在使用VNC时&#xff0c;如果F8不能用的话&#xff0c;可以试试AltF8&#xff1b;然后就是VNC在初始化设置时的三个设置选项依次是密码、再输一次以及设置仅观看密码。…

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带”

【通俗理解】ELBO&#xff08;证据下界&#xff09;——机器学习中的“情感纽带” 关键词提炼 #ELBO #证据下界 #变分推断 #机器学习 #潜变量模型 #KL散度 #期望 #对数似然 第一节&#xff1a;ELBO的类比与核心概念【尽可能通俗】 ELBO&#xff0c;即证据下界&#xff0c;在…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…