簡體   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