作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 @SetMetaData('version', 'v2')
为 Controller 中的 http 方法设置版本控制。然后我有一个自定义的 @Get()
装饰器来将版本作为后缀添加到 Controller 路由。
这样,当我有
@SetMetaData('version', 'v2')
@Get('firstfive')
但我没有看到将 Reflector 注入(inject)我的自定义 @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));
}
请帮帮我!谢谢!
最佳答案
在装饰器中,您无法获取类属性或进行任何类型的注入(inject),因此您将无法获取 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()
关于javascript - 如何在自定义装饰器中使用 NestJS Reflector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65577974/
我是一名优秀的程序员,十分优秀!