以下のURLがあるアセットフォルダーにあるJsonファイルをインポートしたい:
config.json:
{
"url1": "https://jsonplaceholder.typicode.com/posts",
"url2" : "https://reqres.in/api/users",
"url3":"https://fakerestapi.azurewebsites.net/api/Authors"
}
したがって、URLをハードコーディングする代わりに、Jsonファイルからインポートしたいのですが、正確にそれを行う方法がわかりません。
以下に私の問題を示します。
1。Jsonファイルをenvironment.ts
にインポートする方法と、そこからAPIを使用するサービスを取得します
2。ファイルをインポートする場合、prodとlocで同じにする必要がありますdev
欲しいもの:
.json
またはenvironments.prod
をロードする代わりに、アセットフォルダーに格納されている.ts
ファイルにいくつかのURLが含まれる構成ファイルがあります。Jsonファイル構成をロードし、それに基づいてアプリケーションを実行したい
私がしたこと:
以下は、アセットフォルダーに配置したJsonファイルです
{
"baseUrl": "https://jsonplaceholder.typicode.com/",
"baseUrl2": "https://reqres.in/api/users"
}
ConfigServiceService.ts設定ファイルを保存するため
public _config: Object;
constructor(public http:Http) { }
getData(){
debugger;
return this.http.get("./assets/config.json").pipe(map(res => res.json()));
}
この後、サービスファイルを呼び出すためのServiceProviderService.tsを作成します
configData:any;
constructor(public http:Http,public config:ConfigServiceService) {
}
jsonData(){
debugger;
return this.configData;
}
ngOnInit(){
debugger;
this.config.getData().subscribe(res =>{
console.log(res);
this.configData = res;
});
}
app.component.ts
title = 'sample';
constructor(public serv :ServiceProviderService){
this.serv.jsonData();
}
Jsonデータを取得できず、そこにあるロジックをServiceProviderService.tsファイルに配置している場合、それをコンストラクターに配置すると、未定義になります。
注:ここに複数のURLがある場合、各URLはさまざまな個別のサービスファイルに配布されます。1つのサービスファイルのbase1 URLと別のサービスファイルのbase2 URLを想定しています。どうすればそれを達成できますか
https://stackblitz.com/edit/read-local-json-file-5zashx
app.component.tsで未定義になる
これが最善の解決策かどうかはわかりませんが、ここに私がやったことがあります(デフォルトのAngularプロジェクトに既にあるものをカットアンドペーストすることによって)。私は同じ目標を持っていました:I使用している環境(デバッグまたは本番)に応じて、「API URL」を使用可能にする必要がありました。
最初に、2つの既存の.tsファイルに追加の構成設定を追加しました。
..so現在、各ファイルは次のようになっています。
export const environment = {
production: false,
apiUrl: "http://localhost:53104"
};
main.tsファイルにはenvironment
オブジェクトで読み取るコードがすでにあり、environment.production
値を使用しているため、このファイルに少しコードを追加してenvironment.apiUrl
値についても同じようにします。
export function getAPIUrl() {
console.log("API URL: " + environment.apiUrl);
return environment.apiUrl;
}
const providers = [
{ provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] },
{ provide: 'API_URL', useFactory: getAPIUrl, deps: [] }
];
. . .
platformBrowserDynamic(providers).bootstrapModule(AppModule)
.catch(err => console.log(err));
これで、コンポーネント内のこの新しい「API_URL」値にアクセスできます。
例えば:
export class FetchDataComponent {
public forecasts: WeatherForecast[];
constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string, @Inject('API_URL') APIUrl: string) {
http.get<WeatherForecast[]>(baseUrl + 'api/SampleData/WeatherForecasts').subscribe(result => {
this.forecasts = result;
}, error => console.error(error));
console.log("FetchDataComponent, URL: " + APIUrl);
}
}
このページを開くと、出力ウィンドウに自分のURLが表示されます。
FetchDataComponent, URL: http://localhost:53104
このソリューションは大丈夫ですか?他のソリューションよりも(コードがほとんどないので)はるかにシンプルに見えます。
実際、さらに簡単な解決策は、 "API_URL"プロバイダーを使用せず、これをコンポーネントに貼り付けることです。
import { environment } from '../../environments/environment';
..次に、以下を使用して値にアクセスします。
console.log("FetchData, URL: " + environment.apiUrl);
仕事完了!
必須 ????アセットからjsonファイルを読み取る
/assets/urls.json ????
{
"urls": {
"dev": "dev.com",
"prod": "prod.com"
}
}
env.ts
const { urls } = require("../assets/urls.json");
export const environment: IEnv = {
production: false,
baseUrl: urls.dev
};
env.prod.ts
const { urls } = require("../assets/urls.json");
export const environment: IEnv = {
production: true,
baseUrl: urls.prod
};
????インストールする必要があります
npm i @types/node
および更新tsconfig.app.json
このような
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"types": ["node"]
},
"exclude": ["test.ts", "**/*.spec.ts"]
}
Jsonファイルをインポートする場合
declare module "*.json" {
const value: any;
export default value;
}
"typeRoots": [
"node_modules/@types", "./src/typings.d.ts"
],
import * as config from '../assets/config.json';
export const environment = {
baseUrl: config.default.url1
production: true
};
以上です。頑張ってください!