Как использовать NestJS Reflector внутри пользовательского декоратора?

#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. Конечно, вам просто нужно знать ключ метаданных