Weboldal keresés

angular - Az Nswag Typescript API kliens InjectionToken nem oldódik fel


Az Nswag-ot használom egy külső asp.net core szolgáltatáshoz API kliens generálására. Ebben a generált kliensben van

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

Szeretném megoldani ezt.

Az app.module.ts fájlomban hozzáadtam.

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

Az AuthService konstruktőrjében így próbálom használni ezt az API klienst.

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

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

Az environment.ts fájlban nekem van

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

Amikor az alkalmazást a ng serve paranccsal futtatom, az API mindig az Angular projekt alapcímét használja, tehát a http://localhost:4200-t, és nem azt, ami a environment.ts fájlban van.

Mit mulasztottam el?

FRISSÍTÉS: Tisztázás: Van egy külön asp.Net core API-m, amelyhez az Angularból próbálok hozzáférni. A külön API a 5000-es porton van. Az Angular a 4200-as porton van. Tehát nem az Angular portját szeretném megváltoztatni.

Válasz #1

A munkahelyi projektünkben az nswag-et használjuk, de általában az összes generált „kliensünket” injektáljuk, ahelyett, hogy új példányt hoznánk létre. Ha a AccountClient bármennyire is hasonlít a miénkhez, akkor a konstruktorban egy HttpClient-re, valamint egy BASE_URL-re is számítani fog.

(Hivatkozásként, itt látható, hogyan néz ki az egyik generált kliensünk konstruktora):

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

Még egy dolog, és az oka most éppen nem jut eszembe, de a base_url_provider-ünk esetében a useFactory útvonalat választottuk, így ez inkább így néz ki:

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

Szerintem azonban az a mód, ahogyan csinálod, rendben van.

Mindenesetre remélem, hogy ez segít. Ha még mindig nem működik, fel tudnád tenni a generált AccountClient kódját?

SZERKESZTÉS

Most, hogy újra elolvastam a kérdést, a fenti válasz a portszámról lehet az, amit keresel.

Válasz #2

Megpróbálhatod egyszerűen importálni a környezeti változókat abba a komponensbe, ahol használni szeretnéd őket, ebben az esetben egy szolgáltatásba, az AuthService-edbe:

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

és aztán használd ott:

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

Ez egy kicsit bonyolultabb, mert minden olyan komponensbe importálni kell, ahol használják, de az előnye, hogy nem kell globálisan injektálni.

Kapcsolódó cikkek