@pqpqmgmg

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Nuxt.jsでクライアントサイドから外部API通信がしたい

解決したいこと

一週間ほど前からNuxt.jsを学習しております。
RESAS APIから取得した都道府県のデータをもとにチェックボックスを生成し、
チェックが入ったら選択した都道府県の人口構成データを取得するという内容のアプリを作成中です。
(APIキーを秘匿化するために.envファイルを作成し、nuxt.config.jsで.envファイルから
privateRuntimeConfigに設定しております。)

初期表示時はasyncDataを利用することでcontext.$configからAPIキーを取得出来ますが、マウント後に再度API通信を行う場合
APIキーはどのように取得するのが正しいのでしょうか。
今回はマウント後のdataの一部をAPIリクエストに含めたいのでthisが使用できないasyncDataは利用できないと思っています。
また、クライアントサイドのアクションで外部APIと通信する場合はサーバーサイドで通信するという記事も拝見しました。
fetchであればAPIキーも取得でき、thisも使用できるので、APIから取得したデータをVuexに保存すれば良いのかなとも思いますが、通常Nuxt.jsでクライアントサイドからAPI通信する場合はどのような方法で行うのでしょうか。

自分で試したこと

・API_KEYをasyncData以外で使用するために@nuxtjs/dotenvを使用し、ページコンポーネントでprocess.env.API_KEYで取得
(一応取得は出来ましたがdotenvとruntimeConfigを併用すること自体が間違っている気がしています)

nuxt.config.js
require('dotenv').config();
const {API_KEY, API_URL} = process.env;

export default {
・
・
・
  // Modules: https://go.nuxtjs.dev/config-modules
  modules: [
		'@nuxtjs/axios',
		'@nuxtjs/dotenv',
	],
	axios: {
		baseURL: API_KEY,
	},
  // Build Configuration: https://go.nuxtjs.dev/config-build
  build: {},
	
	publicRuntimeConfig: {
		apiUrl: API_URL,
	},
	privateRuntimeConfig: {
		apiKey: API_KEY,
	},
}

index.vue
<script>
export default {
  async asyncData(context){
		const prefs = await context.$axios.$get('/prefectures/',{headers: {'X-API-KEY': context.$config.apiKey}});
		return {prefs: prefs.result};
	},
	data(){
		return {
			selectedPrefId: [],
			apiKey: '',
		}
	},
    mounted(){
       this.setApiKey();
    },
	methods: {
       setApiKey(){
			this.apiKey = process.env.API_KEY;
		},	
	},
}
</script>
0 likes

No Answers yet.

Your answer might help someone💌