【问题标题】:How to use NestJS Reflector inside a Custom Decorator?如何在自定义装饰器中使用 NestJS 反射器?
【发布时间】:2021-04-11 03:34:35
【问题描述】:

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

这样,我可以使用/api/cats/v2/firstfive,当我有

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

但我没有看到将 Reflector 注入我的自定义 @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));
}

请帮帮我! 谢谢!

【问题讨论】:

    标签: javascript node.js nestjs


    【解决方案1】:

    在装饰器中,您无法获取类属性或进行任何类型的注入,因此您将无法获取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() 之前

    【讨论】:

    • 我在任一侧添加了@SetMetadata() 以进行调试,但在上面的@Get 装饰器Reflect.getMetadata('version', target, propertyKey.value); 给出了未定义的。有什么修复吗?
    • 经过一些更改后,我能够让它工作。它们如下: - 使用Reflect.metadata 而不是SetMetadata - 将获取返回类型更改为MethodDecorator - 使用propertyKey 而不是propertyKey.value 所有其他似乎都有效。谢谢!一旦你做出这些改变,我就可以接受答案。
    • 是否可以使用该方法从类中获取元数据?
    • 当然,你只需要知道元数据键
    猜你喜欢
    • 2020-11-21
    • 2020-06-30
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多