今回達成すること
- API通信をするaxios(アクシオス)モジュールの設定を行い、
- Nuxt.jsのトップページにAPIリクエストを送るボタンを設置します。
完走するとhttp://localhost:8080に、このようなボタンが表示されます。
※ この記事ではNuxt.js(frontディレクトリ内)のファイルを編集します。
axiosのインストールを確認する
手順通りに進んできた方は@nuxtjs/axios
モジュールがインストールされていると思います。
front/package.json
...
"dependencies": {
"nuxt": "^2.0.0",
"@nuxtjs/axios": "^5.3.6"
},
もし見当たらない方は改めてインストールを完了しておいてください。
root $ docker-compose run --rm front yarn add @nuxtjs/axios
それでは作業に入りましょう!
axiosの共通設定ファイルを作成する
「front/plugins」直下にaxiosの共通設定ファイルとなる
下記コマンドを実行して作成しましょう。
root $ touch front/plugins/axios.js
axios.jsにログを仕込む
続いて
開発中はAPI通信を見える化した方がエラーを解決しやすくなります。
また、どう言った設定になっているかも見ることができるので理解も早くなります。
axiosの全ての動作にログを取るように設定しましょう。
front/plugins/axios.js
export default ({ $axios }) => {
// リクエストログ
$axios.onRequest((config) => {
console.log(config)
})
// レスポンスログ
$axios.onResponse((config) => {
console.log(config)
})
// エラーログ
$axios.onError((e) => {
console.log(e.response)
})
}
onRequest
... リクエスト時に行いたい処理を記述します。onResponse
... レスポンス時に行いたい処理を記述します。onError
... エラー時に行いたい処理を記述します。
axios.jsのonErrorについて
ちょっと一息。豆知識。
axiosの処理を記述する際のお作法としてthen
とcatch
が使われます。
then
... APIリクエストが成功した時の処理。catch
... 失敗した時の処理。
記述例
this.$axios.get('https://api.coindesk.com/v1/bpi/currentprice.json')
.then(response => (this.info = response.data.bpi))
.catch(error => console.log(error))
このthen
の処理は場面によって変化しますが、catch
内の処理はconsole.log
を仕込むくらいで大きな変化はありません。
そこでcatch
を省略して書くことができます。
onError処理を書いた場合
this.$axios.get('https://api.coindesk.com/v1/bpi/currentprice.json')
.then(response => (this.info = response.data.bpi))
特別な処理をしたい時だけcatch
を記述すればその処理が優先されます。
onError
に限らず、axiosの共通化できる処理は
(ちょっと一息おわり。)
nuxt.config.jsにプラグインファイルを登録する
先ほど作成したaxios.jsをNuxt.jsが読み込むよう設定を行います。
front/nuxt.config.js(30行目前後)
...
plugins: [
'plugins/axios' // 追加
],
-
plugins
プロパティ ... ファイルパスを記述します。ここに登録したファイルは、Nuxt.jsが初期化される前に読み込まれます。
SPAモードではあまり使いませんが、読み込むタイミングを変更したい場合はこのように書きます。
plugins: [
{ src: '~/plugins/client-only.js', mode: 'client' }, // クライアント側でのみ読み込む
{ src: '~/plugins/server-only.js', mode: 'server' } // サーバー側でのみ読み込む
]
以上でaxiosの設定を終わります。
Railsにリクエストを送るボタンを設置する
最後はAPIリクエストを実行するボタンを設置しましょう。
front/pages/index.vue
<template>
<div>
<button
type="button"
name="button"
@click="getMsg"
>
RailsからAPIを取得する
</button>
<div
v-for="(msg, i) in msgs"
:key="i"
>
{{ msg }}
</div>
</div>
</template>
<script>
export default {
data () {
return {
msgs: []
}
},
methods: {
getMsg () {
this.$axios.$get('/api/v1/hello')
.then(res => this.msgs.push(res))
}
}
}
</script>
-
@click="getMsg"
... ボタンがクリックされるとgetMsg()
のメソッドが呼ばれます。 -
getMsg ()
... このメソッド内でaxiosを使ってAPI通信を行います。今回は"Hello"という文字列を取得するだけなので、
$get(リクエスト先パス)
を使用します。 -
.then(res => this.msgs.push(res))
... 通信が成功した時の処理です。msgs
という配列にRailsから返ってきた"Hello"を追加しています。
Logoコンポーネントを削除する
当初使用されていた
root $ ls front/components
Logo.vue # ←これ
README.md
これはVueのロゴを表示していたコンポーネントで、今後使用することはありません。
削除しときましょう。
root $ cd front && git rm components/Logo.vue && cd ..
cd front
... Logo.vueは「front」ディレクトリ内のGit管理なので、一度移動してgit rm
コマンドを唱えます。
削除の確認しておきましょう。
root $ ls front/components
README.md
OK。削除できました。
ブラウザから変更を確認する
コンテナを立ち上げてindex.vueの変更を確認してみましょう。
root $ docker-compose up
ブラウザからhttp://localhost:8080/にアクセスします。
ボタンが表示されました!
ここまでの確認が取れたらコンテナを削除します。
root $ 「control」+「C」
# docker-compose downでもOK
root $ docker-compose rm -f
# 確認しとく
root $ docker-compose ps -a
まとめ
今回は、axiosの設定を行いhttp://localhost:8080/にAPIを取得するボタンを設置しました。
ただ今のままではRailsから"Hello"を取得することはできません。
ブラウザの同一オリジンポリシーにより、通信が拒否されているからです。
次回予告
次回はこの同一オリジンポリシーやCORSについて理解します。
あとはRails側にCORS設定を行い、Helloを取得するアプリケーションを完成させましょう!
えいやっ!!
(この記事を書いている時に筆者がずっと勘違いしていたことがありました!すません。それはaxiosのbaseURLについて。↓どうぞお読みください。)
【コラム】私はaxiosにbaseURLを登録しない
曲のタイトルみたいになりましたが、また一つ学びがあったので共有します。
Nuxt.jsをフロントエンドとしてAPI通信を行う場合、axios
プロパティにbaseURL
を登録することがあると思います。
nuxt.config.js
axios: {
baseURL: process.env.API_URL
},
厳密にいうと、クライアト(ブラウザ)からリクエストするAPIのURLを指定するプロパティはbrowserBaseURL
です。
-
baseURL
... サーバ側からのリクエストに使うAPI URLを指定 -
browserBaseURL
... クライアト側からのリクエストに使うAPI URLを指定
ただこのbrowserBaseURL
。
デフォルト値はbaseURL
です。
つまり、baseURL
を指定すれば双方のURLを設定できるので、browserBaseURL
を指定しなくても良いのです。
次はbaseURL
のお話。
baseURL
のデフォルト値はhttp://localhost:3000。
RailsのURLがhttp://localhost:3000だった場合はbaseURL
を設定しなくてもRailsにリクエストを飛ばしてくれます。
ただこれは開発環境のみで通用すること。
本番環境の運用も見据え、baseURL
は設定しておきましょう。
ん?baseURL
は設定しないんじゃないの?
そうです。原則は設定します。
が、環境変数API_URL
を使えば設定しなくても良いのです。
このbaseURL
は環境変数API_URL
に上書きされます。
つまり、API_URL
という名前の環境変数を設定すれば、baseURL
すら記述しなくて良いのです。
気をつけて欲しいのが上書きされるということ。
baseURL
を設定しようとも、環境変数API_URL
が優先されます。
# 環境変数
API_URL=http://localhost:3000
# nuxt.config.js
axios: {
baseURL: 'http://localhost:8080'
}
# 結果
axios.defaults.baseURL => http://localhost:3000
コラムまとめ
- クライアント側からのリクエストには
browserBaseURL
のURLが使われる browserBaseURL
のデフォルト値はbaseURL
baseURL
のデフォルト値はhttp://localhost:3000- 環境変数
API_URL
が存在する場合、baseURL
は上書きされる
(コラムおわり)
参考 Axios Module