gpt4 book ai didi

javascript - 如何在自定义装饰器中使用 NestJS Reflector?

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

我正在使用 @SetMetaData('version', 'v2') 为 Controller 中的 http 方法设置版本控制。然后我有一个自定义的 @Get() 装饰器来将版本作为后缀添加到 Controller 路由。

这样,当我有

@SetMetaData('version', 'v2')
@Get('firstfive')

但我没有看到将 Reflector 注入(inject)我的自定义 @Get 装饰器的明确方法。

我的Get装饰器如下,

import { Get as _Get } from '@nestjs/common';
export function Get(path?: string) {
version = /*this.reflector.get('version') or something similar */
return applyDecorators(_Get(version+path));
}

请帮帮我!谢谢!

最佳答案

在装饰器中,您无法获取类属性或进行任何类型的注入(inject),因此您将无法获取 this.reflector 或类似的东西。您可以做的是设置您自己的装饰器,模仿@Get() 并使用Reflect.getOwnMetadata() 方法,然后返回``@Get()` 装饰器。可能有点乱,但大致上是

export function Get(path: string): MethodDecorator {
return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
const version = Reflect.getMetadata('version', target, propertyKey);
Reflect.defineMetadata(PATH_METADATA, version + path, descriptor.value);
Reflect.defineMetadata(METHOD_METADATA, RequestMethod.GET, descriptor.value);
return descriptor;
}
}

PATH_METHODMETHOD_METADATA@nestjs/common/constants 导入,RequestMethod@nestjs/common/enums。这将为您创建一个新的 @Get() 装饰器,它与您的 @SetMetadata() 方法协同工作。如果我没记错的话,装饰器是自下而上运行的,所以请确保 @SetVersion() 出现在 @Get()

之前

关于javascript - 如何在自定义装饰器中使用 NestJS Reflector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65577974/

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