有没有办法通过嵌套提供者获取函数装饰器元数据?

Posted

技术标签:

【中文标题】有没有办法通过嵌套提供者获取函数装饰器元数据?【英文标题】:Is there a way to get function decorator metadata by nest provider? 【发布时间】:2021-12-13 03:34:43 【问题描述】:

我一直在编写一个 nestjs 模块来监视我在 rabbitmq 上的队列和交换,目前要实现库功能,你必须在 RankMyRabbitmqModule 中注册你的交换,然后在你的 Watch 装饰器中匹配它,如下例所示:

模块:

RankMyRabbitmqModule.forRootAsync(
      urls: ['amqp://guest:guest@localhost:5672'],
      exchanges: [
        
          name: 'ex01',
          type: 'direct',
        ,
        
          name: 'ex02',
          type: 'direct',
        ,
      ],
    ),

手表装饰器:

@Watch(
    queue: 'q1',
    exchange: 'ex01',
    routingKey: 'blue',
  )
  blue(msg) 
    console.log('[BLUE]:', msg);
  

它只会监视我的队列并使用参数设置函数来执行里面的东西,但我正在考虑一种改进这个库的方法,我想要一个这样的结构

@Exchange('ex01')
@Injectable()
export class Exchange01 
  @ExchangeRoute(
    routingKey: 'blue',
    queue: 'q1'
  )
  blue(msg) 
    console.log(msg)
  

  @ExchangeRoute(
    routingKey: 'red',
    queue: 'q1'
  )
  red(msg) 
    console.log(msg)
  

为此,我必须先获取提供者元数据,然后还要获取其方法元数据...有没有办法以这种方式获取元数据?这是我目前仅获取装饰器元数据的实现


@Module()
class MyModule implements OnModuleInit
  async OnModuleInit() 
    const discoveryMethods = await params.discovery.providerMethodsWithMetaAtKey(META_KEY);

  //TODO
  //Get Provider By MetaKey
  //Get Providers methods metadata
  



Obs:我正在使用一个名为 @golevelup/nestjs-discovery 的库来获取方法元数据。

如果有办法通过元数据获取我的提供者,然后获取我的提供者方法元数据,这将对我实现这个新功能有很大帮助,有人可以帮助我吗?

【问题讨论】:

【参考方案1】:

我找到了使用同一个库的方法,现在我可以使用下面的这些方法获取方法元数据

const discoveredClasses = await this.discovery.providersWithMetaAtKey(
      decoratorKey,
    );

    for (const  discoveredClass, meta  of discoveredClasses) 
      const queueMeta = this.discovery.classMethodsWithMetaAtKey(
        discoveredClass,
        QUEUE_KEY,
      );

      console.log(queueMeta);
    

第一个是 discovery.providersWithMetaAtKey 它将为我提供所有提供者以及我的目标元密钥

第二个是discovery.classMethodsWithMetaAtKey,它会根据库@golevelup/nestjs-discovery 提供的一种对象类型“discoveredClass”为我提供方法元数据

【讨论】:

以上是关于有没有办法通过嵌套提供者获取函数装饰器元数据?的主要内容,如果未能解决你的问题,请参考以下文章

装饰器知识

Python3装饰器

python全栈学习总结六:装饰器

函数(匿名函数,嵌套函数,高阶函数,装饰器)

python之旅:函数对象函数嵌套名称空间与作用域装饰器

函数对象函数嵌套名称空间与作用域闭包函数装饰器