config.json和使用app.module.ts提供程序中的值

ifmq2ha2  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(219)

目前,我们为每个部署的环境构建一次angular(v15)应用程序,因为我们使用environment.ts文件来处理变量转换。
我想让我们得到一个更类似于我们的后端AspNetcore的流,它的appsettings.json转换。
现在,从JSON文件中读取并交换令牌已经很容易了,但我正在努力解决如何在应用程序启动期间使用JSON文件中的值,特别是在定义我们的NSWAG API Url令牌时。
例如:{ provide: AUTH_API_BASE_URL, useValue: environment.auth_api_url },
根据我所做的阅读和研究,代码应该看起来像这样:

export function initApp(http: HttpClient) {
  return () => {
    return http.get('assets/config/configuration.json')
      .toPromise()
      .then((resp) => {
        console.log('Response 1 - ', resp);
      });
  };
}
providers: [
      {
        provide: APP_INITIALIZER,
        useFactory: initApp,
        multi: true,
        deps: [HttpClient]
      },
      { provide: AUTH_API_BASE_URL, useValue: <needs to change> },

现在,上面示例中的日志工作正常,并且包含了我想要的所有内容。我试着创建一个变量和一个静态变量来保存数据,我也试着在两个提供程序中使用声明为依赖项的类来尝试并长时间地 Shuffle 数据,这样我就可以在声明AUTH_API_BASE_URL提供程序时使用。每次都是undefined。
我不确定这是否是一个时间问题,我已经尝试在获取值之前将AUTH_API_BASE_URL设置为useFactory并超时,仍然没有运气。
有没有办法强迫它等待APP_INITIALIZER完全完成,然后再移动到下一个?
有没有办法在初始应用程序启动之外设置这些提供程序?以下内容对我来说没有任何改变:

Injector.create({providers: [{provide: AUTH_API_BASE_URL, useValue: settings.apiUrls.base_auth_api_url}]});

是否有一种在初始提供者之间传递这些数据的工作方法?除了设置这些基本API URL之外,我现在所做的应该适用于应用程序的其余部分。

gk7wooem

gk7wooem1#

显然,您可以直接导入JSON文件,只需对tsconfig进行一些调整。
TSConfig -添加到“compilerOptions:

"resolveJsonModule": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true

提供程序设置更改如下:

{ provide: API_BASE_URL, useFactory: (settings: AppSettings) => settings.settings.apiUrls.base_api_url, deps: [AppSettings]},

围绕JSON文件的服务 Package 器看起来像:

import appSetting from '../assets/config/configuration.json';

@Injectable({ providedIn: 'root' })
export class AppSettings {
  public settings!: IAppConfig;
  constructor() {
      this.settings = appSetting as IAppConfig;
  }
}

最终可能会在服务类上同时创建静态设置和非静态设置变量。在应用程序启动期间似乎需要非静态的。

相关问题