Angular注入配置服务时config未定义问题求助
问题跟进:从JSON文件读取环境变量后URL失效
这是此前相关问题的跟进内容,已调试许久,虽未解决但有一些发现,寻求帮助。
完整项目结构
app-config.json(/src/assets/)
{ "apiUrl": "localhost:8080" }
app-config.service.ts(/src/app/)
import {Injectable, Injector} from '@angular/core'; import {HttpClient} from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class AppConfigService { private appConfig: any; constructor (private injector: Injector) { } loadAppConfig() { let http = this.injector.get(HttpClient); return http.get('/assets/app-config.json') .toPromise() .then(data => { this.appConfig = data; }) } get config() { return this.appConfig; } }
app.module.ts(/src/app/)
import {APP_INITIALIZER, NgModule} from '@angular/core'; import {HttpClientModule} from '@angular/common/http'; import {AppConfigService} from './app-config.service'; import {CometdService} from './cometd/cometd.service'; const appInitializerFn = (appConfig: AppConfigService) => { return () => { return appConfig.loadAppConfig(); } }; @NgModule({ ... providers: [HttpClientModule, AppConfigService, { provide: APP_INITIALIZER, useFactory: appInitializerFn, multi: true, deps: [AppConfigService] }] }) export class AppModule { constructor(cometdService: CometdService) {} }
cometd.service.ts(/src/app/cometd/)
import {Injectable, OnDestroy} from '@angular/core'; import {Store} from '@ngrx/store'; import * as fromRoot from '../reducers'; import {AppConfigService} from '../app-config.service'; export interface CometDExtended extends cometlib.CometD { websocketEnabled: boolean; } @Injectable({ providedIn: 'root' }) export class CometdService implements OnDestroy { protected cometd: CometDExtended = new cometlib.CometD() as CometDExtended; private subscriptions: cometlib.SubscriptionHandle[] = []; constructor(private environment: AppConfigService, private store: Store<fromRoot.State>) { let config = environment.config; let apiUrl = environment.config.apiUrl; this.cometd.configure('http://localhost:8080/cometd'); this.startConnection(); } ... }
已发现的现象
- 该问题并非仅出现在CometdService,多个服务均受影响;
- AppConfigService的
loadAppConfig()能正确获取到{ "apiUrl": "localhost:8080" }数据; - 注入的AppConfigService实例已定义,为Object类型;
environment.config为undefined,读取environment.config.apiUrl时触发错误:TypeError: Cannot read properties of undefined (reading 'apiUrl')。
内容的提问来源于stack exchange,提问作者podehi
相关产品推荐
相关产品推荐

