Как сделать вызовы сервисов динамическими в зависимости от переданных параметров?

У меня есть контроллер NestJS, аналогичный приведенному ниже. Поэтому в зависимости от параметра, переданного в URL-адресе, я хочу перенаправить на правильный сервис. Службы, как правило, будут иметь одинаковые функции с различной функциональностью и должны быть отдельными службами. Может быть несколько сервисов (может быть, даже больше 10). Будет только 1 контроллер, и я хочу, чтобы проверка была во всех функциях/apis в контроллере, поэтому если/иначе проверки во всех будут слишком громоздкими. Итак, как могу ли я централизовать его, чтобы я мог проверять параметр id и вызывать соответствующую службу для всех запросов API?

class Controller {

 contructor(private readonly cnnService:CnnService,private readonly bbcService:BbcService)

 @Get(':id') 
 getNewsData() {
  // if id is cnn then 
  return this.cnnService.getNews()
  // else if id is bbc then
  return this.bbcService.getNews()

}

}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Должно быть просто if, верно?

class Controller {

 contructor(private readonly cnnService:CnnService,private readonly bbcService:BbcService)

 @Get(':id') 
 getNewsData(@Param() { id }: {id: string}) {
  if ( id === 'cnn') {
    return this.cnnService.getNews()
  } else if (id === 'bcc') {
    return this.bbcService.getNews()
  } else {
    throw new BadRequestException(`Unknown News outlet ${id}`);
  }
 }

}

Если у вас есть более 4 или около того сервисов, я бы рекомендовал зарегистрировать каждый сервис как пользовательский поставщик следующим образом:

{
  provide: 'cnnService',
  useClass: CnnService
}

Добавив такого рода пользовательский провайдер для каждой службы новостей, которая у вас есть в вашем NewsModule, вы можете затем внедрить класс ModuleRef и сделать return this.moduleRef.get(${id}Service).getNews() в методе вашего контроллера, чтобы переключаться между используемыми службами, при необходимости перехватывая ошибки в фильтр.

Да, но может быть несколько сервисов (может быть, даже больше 10). Будет только 1 контроллер, и я хочу, чтобы проверка была во всех функциях/API в контроллере, поэтому проверки if/else будут слишком громоздкими. Итак, как могу ли я централизовать его, чтобы я мог проверять параметр id и вызывать соответствующую службу для всех запросов API?

Teknoville 01.04.2022 20:16

Если бы было так много сервисов, я бы зарегистрировал их всех с помощью аналогичной схемы именования (XService), чтобы у всех у них были строковые токены. Тогда вы могли бы использовать moduleRef вместо того, чтобы внедрять каждую службу и делать this.moduleRef.get(${id}Service).getNews() и ловить ошибку, если службы нет.

Jay McDoniel 02.04.2022 04:46

Мне очень нравится эта идея, и я не знал, что мы можем это сделать. Поэтому я добавил этот код в контроллер, и он отлично работает, если я напрямую вызываю this.moduleRef.get(NewsService, {strict: false}).getNews() Only проблема в том, что имя ${id}Service инъекции, похоже, выдает ошибку, поскольку не позволяет мне это сделать. Любое предложение по этому поводу? this.moduleRef.get(${id}Service, {strict: false}).getNews() выдает ошибку

Teknoville 02.04.2022 10:02

Добавил в свой ответ несколько ссылок и пример пользовательского провайдера

Jay McDoniel 02.04.2022 17:58

Спасибо, мне удалось реализовать функциональность с помощью пользовательского поставщика.

Teknoville 04.04.2022 17:10

Другие вопросы по теме