news 2026/4/22 22:48:02

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/4/23 1:54:57

强化学习蒙特卡洛策略迭代方法求最优策略的代码实现(二)

这里直接融合了first visit和every visit&#xff0c;当选择every visit&#xff0c;策略更新使用stochastic的epsilon greedy&#xff1b;选择first visit&#xff0c;策略更新使用greedy。理论基础&#xff1a;需要说明&#xff1a;1. 由于我发现agent大多数时候更倾向于呆在…

作者头像 李华
网站建设 2026/4/23 11:24:28

28岁大专成功转行网络安全:我总结的8条血泪教训与避坑指南

网络安全行业 “人才缺口 300 万 、平均年薪超 25 万” 的红利&#xff0c;让无数职场人动了转行心思。尤其是学历普通&#xff08;如大专&#xff09;的群体&#xff0c;既面临原有岗位的天花板&#xff0c;又渴望通过技术转型实现薪资跃迁。但网安行业看似门槛低&#xff0c;…

作者头像 李华
网站建设 2026/4/23 11:25:55

5步掌握Playground v2.5:AI绘画新利器

想要用AI创作出令人惊艳的艺术作品却不知从何开始&#xff1f;Playground v2.5 1024px Aesthetic模型正是你需要的创作伙伴。这款先进的文本到图像生成模型能够创作出1024x1024分辨率的高质量图像&#xff0c;支持多种宽高比&#xff0c;让你从文字描述轻松转化为视觉艺术。 【…

作者头像 李华
网站建设 2026/4/23 12:55:33

30分钟构建0x00000057错误诊断MVP

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个0x00000057错误诊断MVP。核心功能&#xff1a;1. 错误代码输入界面&#xff1b;2. 基础诊断功能&#xff1b;3. 简单修复建议&#xff1b;4. 用户反馈收集。要求&#…

作者头像 李华
网站建设 2026/4/22 20:13:02

基于高尔夫优化算法GOA求解无人机三维路径规划研究附Matlab代码

作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询内…

作者头像 李华
网站建设 2026/4/20 11:12:20

MySQL进阶篇——sql优化

优化很多是基于索引的&#xff0c;结合上一篇中的性能分析。1、insert优化--批量插入 insert into tb_test values(1,tom),(2,cat),(3,jerry); --手动事务提交 start transaction; insert into...; insert into...; commit; --主键顺序插入&#xff08;性能高于乱序插入&#x…

作者头像 李华