とろろこんぶろぐ

かけだしR&Dフロントエンジニアの小言

nuxtでaxiosのhostの設定について

概要

nuxtでクライアント側から$axiosAPIアクセスする際に、一番ベストなホストの設定の仕方はどうすべきなのか調べた。

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",
  },

Options | Axios Module

baseURLserverから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が解決されないので本番では動かない。

axios-module/module.js at 932abc071b1e1bb64e8d8fc1fdd6e6f9ceb99b5a · nuxt-community/axios-module · GitHub

勝手にlocalhost:3000になる。

コードを読むと環境変数API_HOST, API_PORTを入れる方法もありそう。

baseURLは、browserBaseURLとhttpsのときしかoptionsに入れてないような気がする。まあ使ってないし知らないけど...

pluginでaxiosを差し込む

plugins/axios.jsを用意する方法もある。らしい。やったことはない。

プラグイン - NuxtJS

蛇足 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コンポーネント設計