VonaJS AOP编程:全局中间件全攻略

news/2025/10/11 10:10:55/文章来源:https://www.cnblogs.com/zhennann/p/19134406

在VonaJS框架中,AOP编程包括三方面:控制器切面内部切面外部切面控制器切面包括五能力:MiddlewareGuardInterceptorPipeFilter

其中,Middleware又分为:局部中间件全局中间件系统中间件。其时序图如下所示:

aspect-controller

由图可知,系统中间件在路由匹配之前执行,局部中间件全局中间件在路由匹配之后执行。

为了简化起见,这里仅介绍全局中间件的用法,局部中间件系统中间件的用法,请参见官方文档。

创建中间件

比如,在模块 demo-student 中创建一个 全局中间件: logger

1. Cli命令

$ vona :create:bean middleware logger --module=demo-student --boilerplate=cli/middlewareGlobal/boilerplate

2. 菜单命令

右键菜单 - [模块路径]: `Vona Aspect/Middleware Global`

中间件定义

export interface IMiddlewareOptionsLogger extends IDecoratorMiddlewareOptionsGlobal {}@Middleware<IMiddlewareOptionsLogger>({ global: true })
export class MiddlewareLogger extends BeanBase implements IMiddlewareExecute {async execute(_options: IMiddlewareOptionsLogger, next: Next) {const timeBegin = Date.now();const res = await next();const timeEnd = Date.now();console.log('time: ', timeEnd - timeBegin);return res;}
}
  • IMiddlewareOptionsLogger: 定义中间件参数
  • execute: 输出执行时长

使用中间件

与局部中间件不同,系统会自动加载全局中间件,并使其生效

中间件参数

可以为中间件定义参数,通过参数更灵活的配置中间件逻辑

比如,为 logger 中间件定义prefix参数,用于控制输出格式

1. 定义参数类型

export interface IMiddlewareOptionsLogger extends IDecoratorMiddlewareOptionsGlobal {
+ prefix: string;
}

2. 提供参数缺省值

@Middleware<IMiddlewareOptionsLogger>({global: true,
+ prefix: 'time',
})

3. 使用参数

export interface IMiddlewareOptionsLogger extends IDecoratorMiddlewareOptionsGlobal {prefix: string;
}@Middleware<IMiddlewareOptionsLogger>({global: true,prefix: 'time',
})
class MiddlewareLogger {async execute(options: IMiddlewareOptionsLogger, next: Next) {const timeBegin = Date.now();const res = await next();const timeEnd = Date.now();
-   console.log('time: ', timeEnd - timeBegin);
+   console.log(`${options.prefix}: `, timeEnd - timeBegin);return res;}
}

4. 使用时指定参数

可以针对某个 API 单独指定全局中间件的参数

+ import { Aspect } from 'vona-module-a-aspect';class ControllerStudent {@Web.get()
+ @Aspect.middlewareGlobal('demo-student:logger', { prefix: 'elapsed' })async findMany() {}
}
  • 在使用中间件时直接提供参数值即可

5. App config配置

可以在 App config 中配置中间件参数

src/backend/config/config/config.ts

// onions
config.onions = {middleware: {'demo-student:logger': {prefix: 'elapsed',},},
};

6. 参数优先级

使用时指定参数 > App config配置 > 参数缺省值

中间件顺序

由于全局中间件是默认加载并生效的,所以,VonaJS 提供了两个参数,用于控制中间件的加载顺序

1. dependencies

比如,系统有一个内置全局中间件a-core:gate,我们希望加载顺序如下:a-core:gate > Current

@Middleware({global: true,
+ dependencies: 'a-core:gate',prefix: 'time',
})
class MiddlewareLogger {}

2. dependents

dependents的顺序刚好与dependencies相反,我们希望加载顺序如下:Current > a-core:gate

@Middleware({global: true,
+ dependents: 'a-core:gate',prefix: 'time',
})
class MiddlewareLogger {}

中间件启用/禁用

可以针对某些 API 控制全局中间件的启用/禁用

1. Enable

  • 针对某个 API 禁用
class ControllerStudent {@Web.get()
+ @Aspect.middlewareGlobal('demo-student:logger', { enable: false })async findMany() {}
}
  • 针对所有 API 禁用

src/backend/config/config/config.ts

// onions
config.onions = {middleware: {'demo-student:logger': {
+     enable: false,},},
};

2. Meta

可以让全局中间件在指定的运行环境生效

名称 类型 说明
flavor string|string[] 参见: 运行环境与Flavor
mode string|string[] 参见: 运行环境与Flavor
instanceName string|string[] 参见: 多实例/多租户
host string|string[] 主机名
  • 举例
@Middleware({global: true,
+ meta: {
+   flavor: 'normal',
+   mode: 'dev',
+   instanceName: '',
+   host: 'localhost:7102',
+ },
})
class MiddlewareLogger {}

3. match/ignore

可以针对指定的 API 启用/禁用全局中间件

名称 类型 说明
match string|regexp|(string|regexp)[] 针对哪些API启用
ignore string|regexp|(string|regexp)[] 针对哪些API禁用

查看当前生效的全局中间件清单

可以直接在 Controller action 中输出当前生效的全局中间件清单

class ControllerStudent {@Web.get()async findMany() {
+   this.bean.onion.middleware.inspect();}
}
  • this.bean.onion: 取得全局 Service 实例 onion
  • .middleware: 取得与中间件相关的 Service 实例
  • .inspect: 输出当前生效的全局中间件清单

当访问findMany API 时,会自动在控制台输出当前生效的全局中间件清单,效果如下:

middleware-1

资源

  • Github:https://github.com/vonajs/vona
  • 文档:https://vona.js.org/

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

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

相关文章

单调队列 (1) - 详解

单调队列 (1) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

2025 年 密度 / 净化 / 零醛添加 / 装修 / 生态板 / 指接板板材厂家推荐:纯品梅花深耕高端定制,打造健康家居板材优质选择

行业背景当前全屋定制板材行业正处于快速发展与升级阶段,消费者对家居健康、环保及个性化设计的需求日益提升。然而,市场上部分板材产品存在环保标准不达标、基材种类单一、饰面风格同质化严重等问题,难以满足高端定…

Python3 math 模块

Python3 math 模块在 Python 中,math 模块是处理基础数学运算的核心库,提供了从简单的加减乘除到复杂的三角函数、对数运算等一系列工具函数。与 Python 内置的算术运算符(如 +、*、**)相比,math 模块的函数在精度…

深入解析:考研复习-线性代数-第二章-矩阵

深入解析:考研复习-线性代数-第二章-矩阵pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

PHP 与 HTML 混写基础

PHP 与 HTML 混写基础这是 PHP 的**模板语法**,允许在 HTML 中嵌入 PHP 代码。让我来详细解释: ## PHP 与 HTML 混写基础 ### 1. 基本语法结构 ```php <?php /* PHP 代码 */ ?> ``` 这是 PHP 代码块的开始和…

2025 年隧道/车丝/打孔/矿用/R780/钢花钢管厂家推荐榜:精准匹配施工需求,优选可靠供应商

近年来,国内基建项目持续推进,矿山开发、隧道施工、桥梁搭建、水利建设等领域对钢管的需求量不断攀升,且对产品规格、性能精度及定制化能力的要求愈发严格。钢管作为工程建设的核心基础材料,其质量直接影响工程结构…

2025 年最新推荐!空压机租赁公司综合实力榜单:涵盖无油 / 高压 / 阿特拉斯等机型及二手买卖置换回收,助力企业精准选靠谱服务商

当前工业生产中,空压机作为核心动力设备,其稳定供应直接影响企业生产效率。但空压机购置成本高、维护复杂,租赁模式成为多数企业的优选。然而,租赁市场乱象频发,部分公司设备老化、库存不足导致交付延迟,售后缺失…

小波神经网络(WNN)预测代码

小波神经网络(WNN)预测代码,结合了小波分析和神经网络的优势,适用于各种时间序列预测任务。 小波神经网络概述 小波神经网络结合了小波变换的多分辨率分析能力和神经网络的非线性映射能力,在预测领域表现出色。特性…

marimo python 响应式notebook 框架

marimo python 响应式notebook 框架marimo python 响应式notebook 框架 包含的特性功能齐全,可以用来替换jupter,streamlit,papermill 等 响应式 git 友好,存储为.py文件 面向数据的设计 ai native 可共享,可以部署…

2025 年报警器厂家最新推荐权威榜单:海湾 / 青鸟 / 利达等品牌全覆盖,详解优质服务商助力安全选购NB烟感/松江烟感/三江烟感/燃气报警器厂家推荐

当前,安全防护需求持续攀升,报警器作为守护生命财产安全的关键设备,市场需求逐年增长。但报警器经销商市场乱象频发,部分经销商以次充好,售卖的产品探测精度低、误报率高,在危险来临时无法及时预警;还有不少经销…

优秀的研发经理,如何布局一周的工作?

所有成功的研发成果,都是技术落地、团队协同、需求对齐与风险防控共同作用的结果。 研发经理不是“技术执行者”,而是“研发战略的转化者与团队效能的推动者”——既要懂技术深度(如架构设计、难点攻关),又要通…

Numerical Heat Transfer and Fluid Flow(《传热与流体流动的数值计算》)

Numerical Heat Transfer and Fluid Flow(《传热与流体流动的数值计算》)Preface1 INTRODUCTION1.1 Scope of the Book1.2 Methods of Prediction1.2-1 Experimental Investigation1.2-2 Theoretical Calculation1…

2025天文台圆顶加工厂家最新推荐榜:专业工艺与品质保障之选

2025天文台圆顶加工厂家最新推荐榜:专业工艺与品质保障之选行业背景在天文学研究与观测领域,天文台圆顶是至关重要的基础设施。它不仅要为天文望远镜等精密设备提供稳定的保护,还要具备良好的操控性能和环境适应性。…

2025风机盘管厂家实力推荐:技术领先与品质保障的行业标杆

2025风机盘管厂家实力推荐:技术领先与品质保障的行业标杆随着现代建筑对室内环境要求的不断提高,风机盘管作为中央空调系统末端设备的重要组成部分,其技术水平和产品质量直接关系到整个空调系统的运行效果。在2025年…

2025蒸发式冷气机厂家TOP5推荐:节能降温与耐用品质深度

2025蒸发式冷气机厂家TOP5推荐:节能降温与耐用品质深度在工业与商业领域持续追求高效节能的今天,蒸发式冷气机凭借其卓越的降温效果与显著的节能优势,正成为越来越多企业的首选。这种环保型降温设备通过水蒸发吸热原…

2025 电缆绝缘材料生产厂家最新推荐榜单:技术实力型企业揭晓,选购指南同步发布

在电力、新能源、轨道交通等领域加速升级的背景下,电缆绝缘材料作为保障系统安全的核心部件,其性能直接决定设备运行稳定性与使用寿命。当前市场品牌数量激增,但产品质量两极分化明显,部分企业为压缩成本降低生产标…

基于Java+Springboot+Vue开发的体育场馆预约管理系统源码+运行步骤

项目简介该项目是基于Java+Springboot+Vue开发的体育场馆预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。…

Linux 终端查看最消耗 CPU 内存的进程

1.CPU占用最多的前10个进程ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10个进程ps auxw|head -1;ps auxw|sort -rn -k4|head -10 3.虚拟内存使用最多的前10个进程ps auxw|head -1;ps auxw|so…

JavaScript性能优化实战大纲 - 指南

JavaScript性能优化实战大纲 - 指南2025-10-11 09:47 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

2025 酒店家具厂家最新推荐榜:北木斋领衔五大实力品牌,品质与创新双驱动选购指南智能酒店家具厂家推荐

随着酒店业向品质化、个性化转型,家具作为空间体验的核心载体,其选择直接关系到酒店的品牌调性与运营效益。当前市场中,既有深耕多年的老牌企业,也涌现出大批主打创新技术的新兴品牌,但同时存在资质混杂、标准不一…