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

Nix*_*xel 2 javascript node.js nestjs

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

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

@SetMetaData('version', 'v2')
@Get('firstfive')
Run Code Online (Sandbox Code Playgroud)

但我没有看到将 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));
}
Run Code Online (Sandbox Code Playgroud)

请帮帮我!谢谢!

Jay*_*iel 9

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

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