使用 addRouteMiddleware 动态添加中间
title: 使用 addRouteMiddleware 动态添加中间
date: 2024/8/4
updated: 2024/8/4
author: cmdragon
excerpt:
摘要:文章介绍了Nuxt3中addRouteMiddleware的使用方法,该功能允许开发者动态添加路由中间件,以实现诸如权限检查、动态重定向及路由变化时的特定操作。内容涵盖路由中间件的概念、addRouteMiddleware的语法、参数、使用示例(包括匿名中间件、命名中间件、全局中间件、覆盖现有中间件)及调试技巧。强调了此功能为Nuxt3应用带来的灵活性和便利性。
categories:
- 前端开发
tags:
- Nuxt3
- 中间件
- 路由
- 动态
- 权限
- 重定向
- 导航


扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
在 Nuxt3 中,addRouteMiddleware 允许开发者在应用程序中动态添加路由中间件。这为你提供了灵活性,可以在不同情况下执行导航守卫,例如处理权限、重定向,以及在路由变化时执行特定操作。
什么是路由中间件?
路由中间件是一个函数,可以在用户导航到特定路由前执行某些操作。它通常用于:
- 检查用户权限
- 动态重定向用户
- 登录或加载数据
在 Nuxt3 中,所有中间件通常位于 middleware/ 目录中,但通过使用 addRouteMiddleware,你可以在运行时动态添加它们。
addRouteMiddleware 语法与参数
语法
addRouteMiddleware(name: string | RouteMiddleware, middleware?: RouteMiddleware, options: AddRouteMiddlewareOptions = {})
参数
name: (string | RouteMiddleware)
- 可以是字符串(用于命名中间件)或一个路由中间件函数,类型为
RouteMiddleware。
- 可以是字符串(用于命名中间件)或一个路由中间件函数,类型为
middleware: (RouteMiddleware)
- 这是一个函数,接受两个参数:
to: 目标路由对象,包含用户要访问的路由信息。from: 源路由对象,包含用户当前所在的路由信息。
- 这是一个函数,接受两个参数:
options: (AddRouteMiddlewareOptions)
- 一个可选的对象,用来设置中间件的额外选项。当前可以设置的选项是:
global: (boolean) 如果设置为true,则该中间件为全局中间件,默认为false。
- 一个可选的对象,用来设置中间件的额外选项。当前可以设置的选项是:
使用 addRouteMiddleware
1. 匿名路由中间件
在你需要简单的逻辑处理时,创建匿名路由中间件非常方便。
示例:禁止访问特定页面
// plugins/my-plugin.ts
export default defineNuxtPlugin(() => {
addRouteMiddleware((to, from) => {
// 如果用户尝试访问 /forbidden 路径,则阻止导航
if (to.path === '/forbidden') {
console.log('访问被阻止:用户尝试访问从未授权的路径:', to.path);
return false; // 阻止导航
}
});
});
解释:
在上述示例中,如果用户尝试访问 /forbidden 页面,导航将被阻止并输出日志。
2. 命名路由中间件
命名路由中间件可以用字符串命名,便于后续调用和覆盖。
示例:记录每次导航日志
// plugins/my-plugin.ts
export default defineNuxtPlugin(() => {
addRouteMiddleware('logger-middleware', (to, from) => {
console.log('用户从', from.path, '导航到', to.path);
});
});
解释:
在这个示例中,我们为中间件命名为 logger-middleware。这个中间件将在每次导航时输出用户的导航日志。可以通过 addRouteMiddleware 的方式再次覆盖同名中间件。
3. 全局路由中间件
全局中间件在每次路由变更时都会执行,适用于需要在每个路由之间共享逻辑的场景。
示例:全局访问控制检查
// plugins/my-plugin.ts
export default defineNuxtPlugin(() => {
addRouteMiddleware('auth-check', (to, from) => {
const isAuthorized = false; // 假设这里是你的认证逻辑
if (!isAuthorized) {
console.warn('用户未授权,重定向到登录页面');
return navigateTo('/login'); // 重定向到登录页面
}
}, { global: true });
});
解释:
在这个示例中,我们创建了一个全局中间件 auth-check,每次路由更改时都会检查用户是否被授权。如果用户未授权,则重定向到 /login 页面。
4. 覆盖现有中间件
当使用命名的中间件时,新的中间件将覆盖已有的同名中间件。如下所示:
// middleware/auth.js
export default defineNuxtRouteMiddleware((to, from) => {
// 原有逻辑
});
// 然后在 plugins 中添加覆盖
// plugins/my-plugin.ts
export default defineNuxtPlugin(() => {
addRouteMiddleware('auth', (to, from) => {
console.log('覆盖了旧的 auth 中间件');
// 新的逻辑
});
});
在这个例子中,plugins/my-plugin.ts 中的中间件将覆盖 middleware/auth.js 中的内容。这样的特性可以帮助我们在特定条件下修改原有逻辑。
进行中间件调试
在开发过程中,调试中间件是个重要步骤。可以使用简单的 console.log 输出调试信息,帮助理解中间件的执行流程。例如:
// plugins/my-plugin.ts
export default defineNuxtPlugin(() => {
addRouteMiddleware((to, from) => {
console.log('[Middleware Debug]', 'From:', from.path, 'To:', to.path);
});
});
这可以帮助你确认中间件的执行顺序和路径变更。
总结
通过使用 addRouteMiddleware,你可以灵活地在 Nuxt3 应用中添加、覆盖和管理路由中间件。这为实现复杂的导航逻辑、访问控制和数据处理提供了必要工具。
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:使用 addRouteMiddleware 动态添加中间 | cmdragon's Blog
往期文章归档:
- 使用 abortNavigation 阻止导航 | cmdragon's Blog
- 使用 $fetch 进行 HTTP 请求 | cmdragon's Blog
- 使用 useState 管理响应式状态 | cmdragon's Blog
- 使用 useServerSeoMeta 优化您的网站 SEO | cmdragon's Blog
- 使用 useSeoMeta 进行 SEO 配置 | cmdragon's Blog
- Nuxt.js必读:轻松掌握运行时配置与 useRuntimeConfig | cmdragon's Blog
- Nuxt.js 路由管理:useRouter 方法与路由中间件应用 | cmdragon's Blog
- useRoute 函数的详细介绍与使用示例 | cmdragon's Blog
- 使用 useRequestURL 组合函数访问请求URL | cmdragon's Blog
- Nuxt.js 环境变量配置与使用 | cmdragon's Blog
- 服务端渲染中的数据获取:结合 useRequestHeaders 与 useFetch | cmdragon's Blog
- 使用 useRequestEvent Hook 访问请求事件 | cmdragon's Blog
- 使用 useNuxtData 进行高效的数据获取与管理 | cmdragon's Blog
- Nuxt 3 使用指南:掌握 useNuxtApp 和运行时上下文 | cmdragon's Blog
- 使用 useLazyFetch 进行异步数据获取 | cmdragon's Blog
- 使用 useLazyAsyncData 提升数据加载体验 | cmdragon's Blog
- Nuxt.js 中使用 useHydration 实现数据水合与同步 | cmdragon's Blog
使用 addRouteMiddleware 动态添加中间的更多相关文章
- js动态添加事件-事件委托
作者:白狼 出处:http://www.manks.top/javascript-dynamic-event.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...
- 后台动态添加的button,如何触发button_click事件?
后台动态添加的button,需要在Page_Load或者Page_Init重新动态生成才能执行button_click public Panel GetContrlType() { Panel pan ...
- jquery动态添加的html,第三方插件无法生效的情况
今天一个问题纠结了半天,问题如下图 问题大致就是如上,新增的内容死活点不起,插件没有生效,在一个装逼前端群里面问,给我的答案是叫我去了解事件委托,了解一下事件冒泡!! 好吧,我一上午加半个下午的时间 ...
- 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】
一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...
- Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...
- Net作业调度(五)—quartz.net动态添加job设计
介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模 ...
- vue中v-bind:class动态添加class
1.html代码 <template v-for='item in names'> <div id="app" class="selectItem&qu ...
- js表单动态添加数据并提交
情景1:已经存在form对象了,动态为form增加对象并提交 function formAppendSubmit(){ var myform=$('#newArticleForm'); //得到for ...
- [转]jquery append 动态添加的元素事件on 不起作用的解决方案
用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...
- jQuery给动态添加的元素绑定事件的方法
我们在开发过程会遇到无法给动态元素添加绑定事件,解决方案如下: 例如 <div id="testdiv"> <ul></ul> </d ...
随机推荐
- 使用edge浏览器时,怎么让alt+tab不切换他的子标签页而只在程序间切换?
使用搜索按钮(WIN+Q),搜索"多任务设置",在弹出的窗口中看到"alt+tab"相关设置.选择"仅打开的窗口",ok搞定.
- uniapp windows 上架 apple store
香蕉云 蒲公英 ios上架助手iOS Development 开发!先用上架助手在certificates里面生成一个p12文件在profiles里面生成mobileprovision文件就欧克了 需 ...
- Freertos学习:01 移植到STM32
--- title: rtos-freertos-01-移植到STM32 EntryName: rtos-freertos-01-porting-on-stm32 date: 2020-06-17 1 ...
- Linux 网络编程的5种IO模型 总结
背景 在网络编程中,经常会用到一些模型,在这里做一下总结. 正文 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO 这是最简单的模型,一般配合多线程来实现. Linux 网络编程的5种IO模型 ...
- Fake权限验证小例子
前言 关于本地测试如何进行Fake权限验证 正文 在我们使用swagger调试本地接口的时候,我们常常因为每次需要填写token而耽误工作,不可能每次调试的时候都去本地测试环境请求一个token进行验 ...
- unp.h的安装以及第一个程序的运行
unp.h的安装以及第一个程序的运行 源代码下载以及编译 点击此处下载源代码 解压到本地文件夹,如果访问不了GitHub的话就用我搬到gitee的仓库吧 git clone https://gitee ...
- 全国产!全志T3+Logos FPGA核心板(4核ARM Cortex-A7)规格书
核心板简介 创龙科技SOM-TLT3F是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核全国产工业核心板,ARM C ...
- java 编程思想--个人总结
从应用开始思考----思考解题思路--将思路分解成一步一步的步骤-----根据每一步的步骤思考如何用代码实现-- -- 不要心急,可以一块一块来完成-- 最后再思考如何用代码实现每两块之间的连接--- ...
- Python脚本报错:DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working import pymssql
报错信息: monitor_mssql.py:10: DeprecationWarning: Using or importing the ABCs from 'collections' instea ...
- 跟我一起学习和开发动态表单系统-前端用vue、elementui实现方法(3)
基于 Vue.Element UI 和 Spring Boot + MyBatis 的动态表单系统前端实现解析 在现代企业信息系统中,动态表单是一种非常常见的功能.它可以根据业务需求灵活地调整表单结构 ...