[英]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.