nuxtでaxiosのhostの設定について
概要
nuxtでクライアント側から$axios
でAPIアクセスする際に、一番ベストなホストの設定の仕方はどうすべきなのか調べた。
nuxt-axios-module
nuxt.config.js
で以下のようにmoduleを設定すれば、nuxtのfetch(or asyncData)で$axios
を呼ぶことができる。この$axios
は、
このときnuxt.config.js
でaxiosのoptionを設定できる。
modules: [ "@nuxtjs/axios", ... ], axios: { baseURL: process.env.BASE_URL || "http://api.example.com", browserBaseURL: process.env.BASE_URL || "http://api.example.com", },
baseURL
でserverからAPIアクセスするhostを設定できる。
browserBaseURL
でブラウザからアクセスするAPIを設定できるはずだが、なぜか動かない...
nuxt-axios-module (proxy)
上記のoptionでproxy
を設定する。
例えば/api
配下にAPIパスを持っているなら、以下のようにproxyできる。
僕が利用しているのはこの方法。
modules: [ "@nuxtjs/axios", ... ], axios: { proxy: true, }, proxy: { "/api/": process.env.API_URL || "http://localhost:3000/", },
nuxt-axios-moduleの厄介なところ
ちなみに、baseURL
が解決されないとhostが解決されないので本番では動かない。
勝手にlocalhost:3000
になる。
コードを読むと環境変数にAPI_HOST
, API_PORT
を入れる方法もありそう。
baseURLは、browserBaseURLとhttpsのときしかoptionsに入れてないような気がする。まあ使ってないし知らないけど...
pluginでaxiosを差し込む
plugins/axios.js
を用意する方法もある。らしい。やったことはない。
蛇足 axios → node.http
ちなみにaxiosのoptionに設定されたbaseURLは、urlの整形時に使われる。
axios/dispatchRequest.js at 405fe690f93264d591b7a64d006314e2222c8727 · axios/axios · GitHub
このためaxiosを呼び出すときに axios.get('/api/test')
というようにrelativeな呼び方でも問題ない。
ちなみにこの返り値はbaseURLが空だとundefined/api/test
になってしまうと思われるので、うまく動かないはず。
axiosだとブラウザなら相対パスでも問題ないと思うので、baseURL: "/"
としてあげれば動くと思う。
Vue.js勉強するなら 後悔しないためのVueコンポーネント設計