大荔县住房和城市建设局网站,建设ftp网站的安全性,知乎网页版,wordpress cms 中文版在VonaJS框架中#xff0c;AOP编程包括三方面#xff1a;控制器切面、内部切面和外部切面。控制器切面包括五能力#xff1a;Middleware、Guard、Interceptor、Pipe、Filter。其中#xff0c;Middleware又分为#xff1a;局部中间件、全局中间件和系统中间件。其时序图如下…在VonaJS框架中AOP编程包括三方面控制器切面、内部切面和外部切面。控制器切面包括五能力Middleware、Guard、Interceptor、Pipe、Filter。其中Middleware又分为局部中间件、全局中间件和系统中间件。其时序图如下所示aspect-controller由图可知系统中间件在路由匹配之前执行局部中间件和全局中间件在路由匹配之后执行。为了简化起见这里仅介绍全局中间件的用法局部中间件和系统中间件的用法请参见官方文档。创建中间件比如在模块 demo-student 中创建一个 全局中间件: logger1. Cli命令$ vona :create:bean middleware logger --moduledemo-student --boilerplatecli/middlewareGlobal/boilerplate2. 菜单命令右键菜单 - [模块路径]: Vona Aspect/Middleware Global中间件定义export interface IMiddlewareOptionsLogger extends IDecoratorMiddlewareOptionsGlobal {}MiddlewareIMiddlewareOptionsLogger({ 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. 提供参数缺省值MiddlewareIMiddlewareOptionsLogger({global: true, prefix: time,})3. 使用参数export interface IMiddlewareOptionsLogger extends IDecoratorMiddlewareOptionsGlobal {prefix: string;}MiddlewareIMiddlewareOptionsLogger({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// onionsconfig.onions {middleware: {demo-student:logger: {prefix: elapsed,},},};6. 参数优先级使用时指定参数 App config配置 参数缺省值中间件顺序由于全局中间件是默认加载并生效的所以VonaJS 提供了两个参数用于控制中间件的加载顺序1. dependencies比如系统有一个内置全局中间件a-core:gate我们希望加载顺序如下a-core:gate CurrentMiddleware({global: true, dependencies: a-core:gate,prefix: time,})class MiddlewareLogger {}2. dependentsdependents的顺序刚好与dependencies相反我们希望加载顺序如下Current a-core:gateMiddleware({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// onionsconfig.onions {middleware: {demo-student:logger: { enable: false,},},};2. Meta可以让全局中间件在指定的运行环境生效名称 类型 说明flavor string|string[] 参见: 运行环境与Flavormode string|string[] 参见: 运行环境与FlavorinstanceName 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 时会自动在控制台输出当前生效的全局中间件清单效果如下