NestJS:如何使用另一个装饰器自动记录@MessagePattern 的输入数据?

Posted

技术标签:

【中文标题】NestJS:如何使用另一个装饰器自动记录@MessagePattern 的输入数据?【英文标题】:NestJS: How to automatically log @MessagePattern's input data with another decorator? 【发布时间】:2021-06-02 01:12:42 【问题描述】:

我有一个控制器,它由外部微服务使用 ClientProxy.send() 方法调用,该方法发送一个被随附的@MessagePattern 装饰器识别的命令并执行该控制器功能:

@Controller()
export class DataController 

  @CustomLogger()
  @MessagePattern( cmd: 'storeData' )
  storeData(
    owner: string,
    dataType: string,
  ): void 

  

现在,每次调用此控制器时,我都想准确记录调用了哪个命令。 我可以简单地在 storeData() 函数中硬编码 Logger.log('storeData') 并为每个下一个函数执行此操作,但是是否可以使用另一个装饰器自动记录 @MessagePattern() 的输入,例如使用 @我会定义自己的CustomLogger?如果有,怎么做?

【问题讨论】:

【参考方案1】:

可以将装饰器与applyDecorators()结合起来。

在您的情况下,您可以像这样创建 LogMessage 装饰器:

// LogMessage.ts
const LogMessage = (cmd: string) => 
  const logger = new Logger('MessageLogger');
  return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => 
    const targetFunc = descriptor.value;
    descriptor.value = function (...args: any[]) 
      logger.log(`Message: $cmd`);
      targetFunc.apply(this, args);
    ;
    return descriptor;
  ;
;

export default LogMessage;

并在一个新的装饰器MessagePatternWithLog中将它与MessagePattern结合起来:

// MessagePatternWithLog.ts
const MessagePatternWithLog = (cmd: string) => 
  return applyDecorators(LogMessage(cmd), MessagePattern(cmd));
;

export default MessagePatternWithLog;

之后你可以像使用其他装饰器一样使用它:

@Controller()
export class DataController 

  @MessagePatternWithLog(cmd: 'storeData')
  storeData(
    owner: string,
    dataType: string,
  ): void 

  

此代码未经测试,但源自工作示例。

【讨论】:

以上是关于NestJS:如何使用另一个装饰器自动记录@MessagePattern 的输入数据?的主要内容,如果未能解决你的问题,请参考以下文章

自制方法装饰器擦除所有元数据,我该如何解决?

如何使用来自@nestjs/mongoose 的@Prop 装饰器添加嵌套的对象数组

如何在不是nestjs路由的方法上设置装饰器

@nestjs/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?

mongoose @prop() 装饰器类型:模式定义中的对象_NestJS

NestJS 的自定义路由装饰器