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)
请帮帮我!谢谢!
在装饰器中,您无法获取类属性,或进行任何类型的注入,因此您将无法获取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_METHOD
和METHOD_METADATA
是从 导入的@nestjs/common/constants
,并且RequestMethod
是从 导入的@nestjs/common/enums
。@Get()
这将为您创建一个与您的方法协同工作的新装饰器@SetMetadata()
。如果我没记错的话,装饰器是自下而上运行的,所以请确保@SetVersion()
在@Get()