找回密码
 立即注册
首页 业界区 业界 VonaJS AOP编程:全局中间件全攻略

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

寥唏 5 小时前
在VonaJS框架中,AOP编程包括三方面:控制器切面、内部切面和外部切面。控制器切面包括五能力:Middleware、Guard、Interceptor、Pipe、Filter。
其中,Middleware又分为:局部中间件、全局中间件和系统中间件。其时序图如下所示:
1.png

由图可知,系统中间件在路由匹配之前执行,局部中间件和全局中间件在路由匹配之后执行。
为了简化起见,这里仅介绍全局中间件的用法,局部中间件和系统中间件的用法,请参见官方文档。
创建中间件

比如,在模块 demo-student 中创建一个 全局中间件: logger
1. Cli命令
  1. $ vona :create:bean middleware logger --module=demo-student --boilerplate=cli/middlewareGlobal/boilerplate
复制代码
2. 菜单命令
  1. 右键菜单 - [模块路径]: `Vona Aspect/Middleware Global`
复制代码
中间件定义
  1. export interface IMiddlewareOptionsLogger extends IDecoratorMiddlewareOptionsGlobal {}
  2. @Middleware<IMiddlewareOptionsLogger>({ global: true })
  3. export class MiddlewareLogger extends BeanBase implements IMiddlewareExecute {
  4.   async execute(_options: IMiddlewareOptionsLogger, next: Next) {
  5.     const timeBegin = Date.now();
  6.     const res = await next();
  7.     const timeEnd = Date.now();
  8.     console.log('time: ', timeEnd - timeBegin);
  9.     return res;
  10.   }
  11. }
复制代码

  • IMiddlewareOptionsLogger: 定义中间件参数
  • execute: 输出执行时长
使用中间件

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

可以为中间件定义参数,通过参数更灵活的配置中间件逻辑
比如,为 logger 中间件定义prefix参数,用于控制输出格式
1. 定义参数类型
  1. export interface IMiddlewareOptionsLogger extends IDecoratorMiddlewareOptionsGlobal {
  2. + prefix: string;
  3. }
复制代码
2. 提供参数缺省值
  1. @Middleware<IMiddlewareOptionsLogger>({
  2.   global: true,
  3. + prefix: 'time',
  4. })
复制代码
3. 使用参数
  1. export interface IMiddlewareOptionsLogger extends IDecoratorMiddlewareOptionsGlobal {
  2.   prefix: string;
  3. }
  4. @Middleware<IMiddlewareOptionsLogger>({
  5.   global: true,
  6.   prefix: 'time',
  7. })
  8. class MiddlewareLogger {
  9.   async execute(options: IMiddlewareOptionsLogger, next: Next) {
  10.     const timeBegin = Date.now();
  11.     const res = await next();
  12.     const timeEnd = Date.now();
  13. -   console.log('time: ', timeEnd - timeBegin);
  14. +   console.log(`${options.prefix}: `, timeEnd - timeBegin);
  15.     return res;
  16.   }
  17. }
复制代码
4. 使用时指定参数

可以针对某个 API 单独指定全局中间件的参数
  1. + import { Aspect } from 'vona-module-a-aspect';
  2. class ControllerStudent {
  3.   @Web.get()
  4. + @Aspect.middlewareGlobal('demo-student:logger', { prefix: 'elapsed' })
  5.   async findMany() {}
  6. }
复制代码

  • 在使用中间件时直接提供参数值即可
5. App config配置

可以在 App config 中配置中间件参数
src/backend/config/config/config.ts
  1. // onions
  2. config.onions = {
  3.   middleware: {
  4.     'demo-student:logger': {
  5.       prefix: 'elapsed',
  6.     },
  7.   },
  8. };
复制代码
6. 参数优先级

使用时指定参数 > App config配置 > 参数缺省值
中间件顺序

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

比如,系统有一个内置全局中间件a-core:gate,我们希望加载顺序如下:a-core:gate > Current
  1. @Middleware({
  2.   global: true,
  3. + dependencies: 'a-core:gate',
  4.   prefix: 'time',
  5. })
  6. class MiddlewareLogger {}
复制代码
2. dependents

dependents的顺序刚好与dependencies相反,我们希望加载顺序如下:Current > a-core:gate
  1. @Middleware({
  2.   global: true,
  3. + dependents: 'a-core:gate',
  4.   prefix: 'time',
  5. })
  6. class MiddlewareLogger {}
复制代码
中间件启用/禁用

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


  • 针对某个 API 禁用
  1. class ControllerStudent {
  2.   @Web.get()
  3. + @Aspect.middlewareGlobal('demo-student:logger', { enable: false })
  4.   async findMany() {}
  5. }
复制代码

  • 针对所有 API 禁用
src/backend/config/config/config.ts
  1. // onions
  2. config.onions = {
  3.   middleware: {
  4.     'demo-student:logger': {
  5. +     enable: false,
  6.     },
  7.   },
  8. };
复制代码
2. Meta

可以让全局中间件在指定的运行环境生效
名称类型说明flavorstring|string[]参见: 运行环境与Flavormodestring|string[]参见: 运行环境与FlavorinstanceNamestring|string[]参见: 多实例/多租户hoststring|string[]主机名

  • 举例
  1. @Middleware({
  2.   global: true,
  3. + meta: {
  4. +   flavor: 'normal',
  5. +   mode: 'dev',
  6. +   instanceName: '',
  7. +   host: 'localhost:7102',
  8. + },
  9. })
  10. class MiddlewareLogger {}
复制代码
3. match/ignore

可以针对指定的 API 启用/禁用全局中间件
名称类型说明matchstring|regexp|(string|regexp)[]针对哪些API启用ignorestring|regexp|(string|regexp)[]针对哪些API禁用查看当前生效的全局中间件清单

可以直接在 Controller action 中输出当前生效的全局中间件清单
  1. class ControllerStudent {
  2.   @Web.get()
  3.   async findMany() {
  4. +   this.bean.onion.middleware.inspect();
  5.   }
  6. }
复制代码

  • this.bean.onion: 取得全局 Service 实例 onion
  • .middleware: 取得与中间件相关的 Service 实例
  • .inspect: 输出当前生效的全局中间件清单
当访问findMany API 时,会自动在控制台输出当前生效的全局中间件清单,效果如下:
2.png

资源


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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册