#javascript #node.js #nestjs
#javascript #node.js #nestjs
Вопрос:
Я использую a @SetMetaData('version', 'v2')
для настройки управления версиями для метода http в контроллере. Затем у меня есть пользовательский @Get()
декоратор для добавления версии в качестве постфикса к маршруту контроллера.
Так что я мог бы использовать /api/cats/v2/firstfive
, когда у меня есть
@SetMetaData('version', 'v2')
@Get('firstfive')
Но я не вижу четкого способа добавить отражатель в мой пользовательский декоратор @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));
}
Пожалуйста, помогите мне здесь!
Спасибо!
Ответ №1:
В декораторах вы не можете получить свойства класса или выполнить какую-либо инъекцию, так что вы не сможете получить 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()
Комментарии:
1. Я добавил @SetMetadata() с обеих сторон для отладки, но в приведенном выше @Get decorator
Reflect.getMetadata('version', target, propertyKey.value);
дает undefined . Какие-либо исправления?2. Я смог заставить его работать после нескольких изменений. Они заключаются в следующем: — Использовать
Reflect.metadata
вместоSetMetadata
— Изменить возвращаемый тип наMethodDecorator
— ИспользоватьpropertyKey
вместоpropertyKey.value
всего остального, похоже, работает. Спасибо! Как только вы внесете эти изменения, я могу принять ответ.3. Можно ли использовать этот метод для получения метаданных из класса?
4. Конечно, вам просто нужно знать ключ метаданных