繁体   English   中英

如何在自定义装饰器中使用 NestJS 反射器?

[英]How to use NestJS Reflector inside a Custom Decorator?

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

这样,我就可以使用/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));
}

请帮帮我! 谢谢!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM