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.
