[英]How to use custom class file in nestjs maintaining the rule of 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_METHOD
和METHOD_METADATA
是從@nestjs/common/constants
導入的, RequestMethod
是從@nestjs/common/enums
導入的。 這將為您創建一個新的@Get()
裝飾器,它與您的@SetMetadata()
方法協同工作。 如果我沒記錯裝飾器是自下而上運行的,那么請確保@SetVersion()
出現在@Get()
之前
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.