有没有办法通过嵌套提供者获取函数装饰器元数据?
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”为我提供方法元数据
【讨论】:
以上是关于有没有办法通过嵌套提供者获取函数装饰器元数据?的主要内容,如果未能解决你的问题,请参考以下文章