Я опубликовал модуль многократного использования для обнаружения метаданных в ваших обработчиках или классах Injectable специально для поддержки этого шаблона.Вы можете получить @nestjs-plus/common
из NPM, а затем использовать DiscoveryService
для автоматического получения всех соответствующих обработчиков или классов на основе предоставленного вами токена MetaData.Исходный код доступен на Github .Я буду продолжать обновлять документы в ближайшее время, но есть несколько примеров его использования, уже включенных в репозиторий.
Под капотом он использует MetaDataScanner, но оборачивает вещи в приятный и простой в использованииAPI.Посмотрите на фрагмент, который вы разместили, это может помочь сократить значительное количество шаблонов для вашего конкретного случая использования.В модуле @nestjs-plus/rabbitmq
(из того же репозитория) вы можете увидеть более продвинутые способы использования этого для склейки расширенной функциональности .
РЕДАКТИРОВАТЬ: я обновил библиотекуподдерживать сценарии обнаружения контроллеров и методы контроллеров для поддержки вашего сценария. Существует полный набор тестов, который имитирует ваши настройки с помощью декоратора @Roles
, который вы можете проверить. .После включения DiscoveryModule
в ваш импорт и введения DiscoverService
вы можете найти все методы контроллера, используя упрощенный methodsAndControllerMethodsWithMeta
API.
// Inject the service
constructor(private readonly discover: DiscoveryService) { }
// Discover all controller methods decorated with guest roles or
// belonging to controllers with guest roles
const allMethods = this.discover.methodsAndControllerMethodsWithMeta<string[]>(
rolesMetaKey,
x => x.includes('guest')
);
После того, как вы обнаружите все методы,после того, как вы сможете делать с ними все, что захотите, в вашем случае создайте коллекцию их RequestMethod
и path
.
const fullPaths = allGuestMethods.map(x => {
const controllerPath = Reflect.getMetadata(
PATH_METADATA,
x.component.metatype
);
const methodPath = Reflect.getMetadata(PATH_METADATA, x.handler);
const methodHttpVerb = Reflect.getMetadata(
METHOD_METADATA,
x.handler
);
return {
verb: methodHttpVerb,
path: `${controllerPath}/${methodPath}`
}
});
, которая выдаст вам нечто подобное (взято из связанного тестаsuite).
expect(fullPaths).toContainEqual({verb: RequestMethod.GET, path: 'guest/route-path-one'});
expect(fullPaths).toContainEqual({verb: RequestMethod.GET, path: 'super/route-path-two'});
expect(fullPaths).toContainEqual({verb: RequestMethod.POST, path: 'admin/route-path-three'});
Не стесняйтесь оставлять отзывы о подходе / API.