当前位置: 首页 > news >正文

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

在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.rkmt.cn/news/18620.html

相关文章:

  • Python3 math 模块
  • 小波神经网络(WNN)预测代码
  • 优秀的研发经理,如何布局一周的工作?
  • Numerical Heat Transfer and Fluid Flow(《传热与流体流动的数值计算》)
  • 2025风机盘管厂家实力推荐:技术领先与品质保障的行业标杆
  • 2025蒸发式冷气机厂家TOP5推荐:节能降温与耐用品质深度
  • 基于Java+Springboot+Vue开发的体育场馆预约管理系统源码+运行步骤
  • 2025 酒店家具厂家最新推荐榜:北木斋领衔五大实力品牌,品质与创新双驱动选购指南智能酒店家具厂家推荐
  • CRM选型指南 | CRM软件成本拆解:本地部署、云租赁
  • 宜倍鲜携手纷享销客CRM开启数字化转型(附四大核心场景)
  • IDEA创建maven项目的不同模板的含义
  • 示波器BLDC需要知道的知识
  • CISA与USCG在关键基础设施威胁狩猎中发现网络安全改进领域
  • 2025年智慧物联与电子信息工程国际学术会议(IoTEIE 2025)
  • 笔记本使用摄像头显示“你的相机报告设备上的开关或按钮已阻止或关闭它”(特别是联想笔记本)
  • 牛客刷题-Day11
  • MySQL - ERROR 2002 (HY000): Cant connect to local MySQL Server through socket /tmp/mysql.sock
  • 直播平台开发,如何实现CPU内存使用情况的检测? - 云豹科技
  • 第十二届行为与社会计算国际会议(BESC)暨2025年机器学习与社会计算国际研讨会(MLSC 2025)
  • 金碟KIS迷你版v12.0sp1注册补丁/金蝶迷你版破解
  • 2025 年酒店一次性用品源头厂家最新推荐榜单:含牙签牙线筷子套杯盖等多品类品牌及配套能力与质检体系详解
  • 金蝶KIS专业版v12.3_破解补丁/金蝶KIS专业版v12.3下载
  • 2025 年最新电缆桥架厂家推荐排行榜:精选不锈钢 / 铝合金 / 热镀锌等多类型优质桥架厂家,助力高效选购热镀锌/热浸锌/托盘式/防火/喷塑电缆桥架厂家推荐
  • PK-CWT/600 罗氏线圈在高压输变电线路故障监测中的应用
  • Pycharm中使用git - 详解
  • 模切 vs CO₂激光切割:非金属材料加工工艺终极对决,如何选择?-外协加工-委外加工-专注于河南郑州激光微纳代加工-激光切割雕刻打孔打标镭雕焊接划线表面处理-芯晨微纳(河南)光电科技有限公司
  • 高QE sCMOS相机在SIM超分辨显微成像中的应用 - 详解
  • 金蝶KIS云.标准版v14.0破解补丁(20211201)
  • KDL - DTS and IDE
  • 智慧记v7.0.x破解补丁及智慧记v7.0安装程序下载