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/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?