Клиент Nswag Typescript API InjectionToken не решается - PullRequest
2 голосов
/ 16 января 2020

Я использую Nswag для генерации API-клиента для внешней базовой службы asp. net. В этом сгенерированном клиенте у меня есть

export const API_BASE_URL = new InjectionToken<string>('API_BASE_URL');

Я хочу решить эту проблему.

В моем app.module.ts я добавил.

providers: [
  AuthGuardService,
  AuthService,
  {
    provide: GeneratedAPIClient.API_BASE_URL,
    useValue: environment.API_BASE_URL
  }
]

В конструкторе моего AuthService я пытаюсь использовать этот API-клиент следующим образом.

constructor(
  private router: Router, 
  private http: HttpClient) {
    const client = new GeneratedAPIClient.AccountClient(this.http);

    client.userinfo().subscribe((userInfoData) => {
         // stuff
    });
}

В environment.ts у меня есть

export const environment = {
  production: false,
  API_BASE_URL: 'http://localhost:5000'
};

при запуске приложения с ng serve API всегда использует базовый адрес для проекта angular, то есть http://localhost:4200, а не то, что у меня есть в файл environment.ts.

Что я пропустил?

ОБНОВЛЕНИЕ: Уточнение: у меня есть отдельный asp. Net базовый API, к которому я пытаюсь получить доступ из Angular , Отдельный API находится на порте 5000. Angular на порте 4200. Поэтому я не собираюсь менять порт углов.

Ответы [ 3 ]

1 голос
/ 16 января 2020

Вы можете просто импортировать переменные среды в компонент, где вам нужно их использовать, в данном случае в сервисе, в вашем AuthService:

import { environment } from 'src/environments/environment';

и затем использовать его там:

this.http.get(environment.API_BASE_URL + ...).subscribe(...);

Это немного сложнее, потому что вам нужно импортировать во все компоненты, где он используется, но, с другой стороны, вам не нужно внедрять его глобально.

1 голос
/ 16 января 2020

Я понял это с помощью двух ответов, но часть головоломки все еще отсутствовала ..

Мой провайдер в app.module.ts теперь выглядит следующим образом.

  providers: [
    {
      provide: GeneratedAPIClient.API_BASE_URL, // <-- this is still here
      useValue: environment.API_BASE_URL
    },
    AuthGuardService,
    AuthService,
    GeneratedAPIClient.AccountClient // <-- note this addition.
  ],

После того, как было сделано вышеупомянутое добавление, я мог бы сделать это в конструкторе.

constructor(@Inject(GeneratedAPIClient.AccountClient) client: GeneratedAPIClient.AccountClient) { }

Теперь я получаю экземпляр клиента, и при таком вводе клиент также получает набор API_BASE_URL на правильный URL.

1 голос
/ 16 января 2020

Мы используем nswag в нашем проекте на работе, но обычно внедряем всех наших сгенерированных «клиентов» вместо того, чтобы обновлять их. Если AccountClient похож на наш, он будет ожидать HttpClient в конструкторе, а также BASE_URL.

(Для справки, вот как выглядит конструктор одного из наших сгенерированных клиентов):

constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) 
baseUrl?: string) {
    this.http = http;
    this.baseUrl = baseUrl ? baseUrl : "http://localhost:61350";
}

Еще одна вещь, причина которой ускользает от меня на данный момент, но пошла Используйте маршрут Factory на нашем base_url_provider, чтобы он выглядел примерно так:

{
    provide: API_BASE_URL,
    useFactory: () => {
        return `${environment.API_BASE_URL}`;
    }
}

Хотя я думаю, что вы делаете это хорошо.

В любом случае, надеюсь, это поможет. Если это все еще не работает, не могли бы вы опубликовать код сгенерированного AccountClient?

EDIT

Теперь, когда я перечитал вопрос, ответ выше о номере порта может быть тем, что вы Ищите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...