gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:16:02 28 4
gpt4 key购买 nike

我将 NestJS 和 nestjs/swagger 模块用于简单的 api 文档,但我遇到了麻烦,因为我需要验证服务的响应。

这就是我创建自制方法装饰器的原因,但我在使用它时遇到了很大的麻烦——来自另一个装饰器的所有元数据都在丢失,并且 swagger 模块无法显示良好的文档。

我的装饰器代码

export function validate(classValidatorEntity: any): MethodDecorator {
return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
const origMethod = descriptor.value;
descriptor.value = async function() {
const result = await origMethod.apply(this, arguments);
console.log(result); // validationFunc(result) in original method
return result;
};
};
}

一些 Controller 方法的代码示例

  @Post('test')
@ApiOkResponse({
type: someResDto
})
@ResponseValidator(ActualizeFlightQueueResponseDto)
public async test(@Body() body: someReqDto): Promise<someResDto> {
return {result: true}
}

如果我的装饰器在顶部(第一个)——所有元数据都丢失了。如果我的 daecorator 是最后一个 - 我从 @Body() 装饰器丢失数据....

我不知道该怎么做,也不知道我需要如何重写我自己的装饰器。

最佳答案

元数据与特定的descriptor.value相关联,您必须将origMethod相关联的元数据重新应用到新的descriptor.value >

首先定义一个元数据copyMetadata方法

const copyMetadata = (source: Object, target: Object): void => {
for (const key of Reflect.getMetadataKeys(source)) {
Reflect.defineMetadata(key, Reflect.getMetadata(key,source), target);
}
}

然后将元数据重新应用到新的descriptor.value

export function validate(classValidatorEntity: any): MethodDecorator {
return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
const origMethod = descriptor.value;
descriptor.value = async function() {
const result = await origMethod.apply(this, arguments);
console.log(result); // validationFunc(result) in original method
return result;
};
copyMetadata(origMethod, descriptor.value);
};
}

关于typescript - 自制方法装饰器删除所有元数据,我该如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62237400/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com