news 2026/3/26 18:41:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VonaJS AOP编程:全局中间件全攻略

在VonaJS框架中,AOP编程包括三方面:控制器切面、内部切面和外部切面。控制器切面包括五能力:Middleware、Guard、Interceptor、Pipe、Filter。

其中,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 时,会自动在控制台输出当前生效的全局中间件清单,效果如下:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 0:44:25

Reddit视频批量生成:从单点操作到规模化生产的技术转型

Reddit视频批量生成&#xff1a;从单点操作到规模化生产的技术转型 【免费下载链接】RedditVideoMakerBot Create Reddit Videos with just✨ one command ✨ 项目地址: https://gitcode.com/GitHub_Trending/re/RedditVideoMakerBot 当你的内容团队需要处理上百条Reddi…

作者头像 李华
网站建设 2026/3/25 20:07:38

万亿参数大模型成本直降80%:Kimi K2如何用MoE架构重塑企业AI应用

导语 【免费下载链接】Kimi-K2-Instruct-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Kimi-K2-Instruct-GGUF 月之暗面发布的Kimi K2大模型以1万亿总参数规模和320亿激活参数的混合专家&#xff08;MoE&#xff09;架构&#xff0c;在保持顶级性能的同时…

作者头像 李华
网站建设 2026/3/16 17:46:59

Obsidian Kanban图片添加终极指南:新手必学的简单技巧

Obsidian Kanban图片添加终极指南&#xff1a;新手必学的简单技巧 【免费下载链接】obsidian-kanban Create markdown-backed Kanban boards in Obsidian. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-kanban 想要让Obsidian Kanban看板更加生动直观吗&#…

作者头像 李华
网站建设 2026/3/17 23:26:39

双接口固态硬盘长时间传输大文件会过热掉速吗

在今天的数字化时代&#xff0c;越来越多的人开始使用移动固态硬盘&#xff08;SSD&#xff09;来存储和传输文件&#xff0c;尤其是那些需要频繁处理大文件的用户。无论是视频编辑、图形设计&#xff0c;还是大型数据传输&#xff0c;SSD都以其卓越的速度和高效性能成为了工作…

作者头像 李华
网站建设 2026/3/21 15:22:41

GPT5.2全面解析:从UI设计到文献处理,大模型应用实战指南

本文详细测评了GPT5.2的重大更新&#xff0c;通过与Gemini 3的对比发现&#xff0c;GPT5.2在知识库更新、幻觉减少、理解力等方面表现优异&#xff0c;前端界面复刻能力突出&#xff0c;PPT制作功能进步明显&#xff0c;统计分析能力提升。虽然图片处理仍是短板&#xff0c;但其…

作者头像 李华