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

往期文章归档:

使用 addRouteMiddleware 动态添加中间的更多相关文章

  1. js动态添加事件-事件委托

    作者:白狼 出处:http://www.manks.top/javascript-dynamic-event.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...

  2. 后台动态添加的button,如何触发button_click事件?

    后台动态添加的button,需要在Page_Load或者Page_Init重新动态生成才能执行button_click public Panel GetContrlType() { Panel pan ...

  3. jquery动态添加的html,第三方插件无法生效的情况

    今天一个问题纠结了半天,问题如下图  问题大致就是如上,新增的内容死活点不起,插件没有生效,在一个装逼前端群里面问,给我的答案是叫我去了解事件委托,了解一下事件冒泡!! 好吧,我一上午加半个下午的时间 ...

  4. 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】

    一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...

  5. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...

  6. Net作业调度(五)—quartz.net动态添加job设计

    介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模 ...

  7. vue中v-bind:class动态添加class

    1.html代码 <template v-for='item in names'> <div id="app" class="selectItem&qu ...

  8. js表单动态添加数据并提交

    情景1:已经存在form对象了,动态为form增加对象并提交 function formAppendSubmit(){ var myform=$('#newArticleForm'); //得到for ...

  9. [转]jquery append 动态添加的元素事件on 不起作用的解决方案

    用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...

  10. jQuery给动态添加的元素绑定事件的方法

    我们在开发过程会遇到无法给动态元素添加绑定事件,解决方案如下: 例如 <div id="testdiv">   <ul></ul> </d ...

随机推荐

  1. webpack配置css预处理

    webpack默认只支持js的打包,不支持其它类型,为了让它支持样式的打包就需要加载一些loader 打包css文件 在webpack中配置对应的loader 在入口js文件中通过import导入样式 ...

  2. CF1815

    CF1815 Div. 1 确实难,Virtual Contest 上只完成了两道题,想出来了三道题. A. Ian and Array Sorting 秒切题--考虑将前 \(n - 1\) 个数变 ...

  3. linux系统下,搭建kafka环境(单机版)

    安装前准备: 安装JDK 安装zookeeper(如果使用kafka内置的zookeeper,可以忽略) 第一步.安装JDK kafka依赖JAVA环境,所以首先要安装jdk 第二步.安装zookee ...

  4. web框架及Django简介

    WEB框架 Web框架是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法. web框架已经实现了很多功能 ...

  5. 算法金 | 一文彻底理解机器学习 ROC-AUC 指标

    ​ 大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 在机器学习和数据科学的江湖中,评估模型的好坏是非常关键的一环.而 ROC(Rece ...

  6. The bean ‘xxx‘ could not be injected as a ‘xxx‘because it is a JDK dynamic proxy that implements错误解决

    1.解决方法:使用@Autowired 2.@autowired和@resource注解的区别区别:1.@Autowired注解由Spring提供,只按照byType注入:@resource注解由J2 ...

  7. readonly和disable的区别是什么?

    Readonly和Disabled两种属性的写法如下: 1.<input type="text" name="name" value="xxx& ...

  8. 《Javscript实用教程》目录

    图书购买地址: 京东:<Javscript实用教程> 当当:<Javscript实用教程> 天猫:<Javscript实用教程> 注:本书提供源码和ppt课件,下载 ...

  9. python 使用pandas修改数据到excel,报“SettingwithCopyWarning A value is trying to be set on a copy of a slice from a DataFrame”的解决方法

    场景: 通过pandas模块,将测试数据回写到excel,测试数据有写到excel文件,但控制台输出警告信息如下 警告: SettingwithCopyWarning A value is tryin ...

  10. Java常用的十大开源工具类库总结

    以下是个人总结的Java常用的十大开源工具类库,根据具体需求和项目,可以选择合适的工具类库来提高开发效率.1. Apache Commons:Apache Commons是一个开源的工具类库,提供了大 ...