安全,輕松的Axios與Nuxt.js集成

地址:https://www.homwang.com 歡迎大家性能測試
交流討論——QQ群號:604203227

?? Axios

安全,輕松的Axios與Nuxt.js集成

特性

? 自動為客戶端和服務器端設置基本URL

? 公開功能,以便我們可以輕松地全局設置身份驗證令牌setToken$axios

? 請求基本URL時自動啟用withCredentials

? SSR中的代理請求頭(對于auth有用)

? 獲取樣式請求

? 在提出請求時與Nuxt.js Progressbar集成

? 集成 Proxy Module

? 具有自動重試請求 axios-retry

使用

yarn 和 npm 安裝:

yarn add @nuxtjs/axios
OR
npm install @nuxtjs/axios

nuxt.config.js

module.exports = {
  modules: [
    '@nuxtjs/axios',
  ],
?
  axios: {
    // proxyHeaders: false
  }
}

Component

asyncData

async asyncData({ $axios }) {
  const ip = await $axios.$get('http://icanhazip.com')
  return { ip }
}

methods/created/mounted/etc

methods: {
  async fetchSomething() {
    const ip = await this.$axios.$get('http://icanhazip.com')
    this.ip = ip
  }
}

Store nuxtServerInit

async nuxtServerInit ({ commit }, { $axios }) {
  const ip = await $axios.$get('http://icanhazip.com')
  commit('SET_IP', ip)
}

Store actions

// In store
{
  actions: {
    async getIP ({ commit }) {
      const ip = await this.$axios.$get('http://icanhazip.com')
      commit('SET_IP', ip)
    }
  }
}

擴展

如果您需要通過注冊攔截器和更改全局配置來自定義axios,則必須創建一個nuxt插件。

nuxt.config.js

{
  modules: [
    '@nuxtjs/axios',
  ],
?
  plugins: [
    '~/plugins/axios'
  ]
}

plugins/axios.js

export default function ({ $axios, redirect }) {
  $axios.onRequest(config => {
    console.log('Making request to ' + config.url)
  })
?
  $axios.onError(error => {
    const code = parseInt(error.response && error.response.status)
    if (code === 400) {
      redirect('/400')
    }
  })
}

攔截器

Axios插件提供幫助程序,可以更輕松,更快速地注冊axios攔截器。

  • onRequest(config)

  • onResponse(response)

  • onError(err)

  • onRequestError(err)

  • onResponseError(err)

默認情況下,這些函數不必返回任何內容。

示例: (plugins/axios.js)

export default function ({ $axios, redirect }) {
  $axios.onError(error => {
    if(error.code === 500) {
      redirect('/sorry')
    }
  })
}

獲取樣式請求

Axios插件還支持使用前綴 $ 的樣式方法來獲取請求:

// Normal usage with axios
let data = (await $axios.get('...')).data
?
// Fetch Style
let data = await $axios.$get('...')

設置頭部信息

setHeader(name, value, scopes='common')

Axios實例有一個幫助方法,可以輕松設置任何標頭。

參數:

  • name: 標題的名稱
  • value: 標頭的值
  • scopes: 默認僅針對特定類型的請求發送。
    • Type: 數組或字符串
    • Defaults: 默認所有類型的請求為 common
    • 可以是 get, post, delete, ...
// Adds header: `Authorization: 123` to all requests
this.$axios.setHeader('Authorization', '123')
?
// Overrides `Authorization` header with new value
this.$axios.setHeader('Authorization', '456')
?
// Adds header: `Content-Type: application/x-www-form-urlencoded` to only post requests
this.$axios.setHeader('Content-Type', 'application/x-www-form-urlencoded', [
  'post'
])
?
// Removes default Content-Type header from `post` scope
this.$axios.setHeader('Content-Type', false, ['post'])

設置Token

setToken(token, type, scopes='common')

Axios實例有一個幫助方法,可以輕松設置全局身份驗證標頭。

參數:

  • token: 授權令牌
  • type: 授權令牌前綴(通常為 Bearer
  • scopes: 默認僅針對特定類型的請求發送。
    • Type: 數組或字符串
    • Defaults: 默認所有類型的請求為 common
    • 可以是 get, post, delete, ...
// Adds header: `Authorization: 123` to all requests
this.$axios.setToken('123')
?
// Overrides `Authorization` header with new value
this.$axios.setToken('456')
?
// Adds header: `Authorization: Bearer 123` to all requests
this.$axios.setToken('123', 'Bearer')
?
// Adds header: `Authorization: Bearer 123` to only post and delete requests
this.$axios.setToken('123', 'Bearer', ['post', 'delete'])
?
// Removes default Authorization header from `common` scope (all requests)
this.$axios.setToken(false)

選項

您可以使用 axios 模塊選項或部分選項在 nuxt.config.js 配置

prefixhostport

該選項使用在 baseURLbrowserBaseURL

可以自定義 API_PREFIX, API_HOST (或 HOST) 和 API_PORT (或 PORT) 環境變量。

prefix 的默認值為 /

baseURL

  • Default: baseURL (或 prefix 在使用 options.proxy 啟用)

在客戶端使用和預先添加請求的基本URL。

環境變量 API_URL_BROWSER 可用于覆蓋 browserBaseURL

https

  • Default: false

如果設置為 truehttp://baseURLbrowserBaseURL 將會變成 https://

progress

  • Default: true

在和Nuxt.js集成時并發出請求時顯示加載條(只有在瀏覽器上加載條時可用)

還可以使用 progress 配置禁用每個請求的進度條。

nuxt.config.js

{
  modules: [
    '@nuxtjs/axios'
  ],
?
  axios: {
    proxy: true // Can be also an object with default options
  },
?
  proxy: {
    '/api/': 'http://api.example.com',
    '/api2/': 'http://api.another-website.com'
  }
}

注意:不需要手動注冊 @nuxtjs/proxy 模塊,但它確實需要在您的依賴項中。

注意:將 /api 添加到API端點的所有請求中。如果需要刪除它,請使用 /pathRewrite

proxy: {
  '/api/': { target: 'http://api.example.com', pathRewrite: {'^/api/': ''} }
}

retry

  • Default: false
    • 自動攔截失敗的請求,并在每次使用 axios-retry 時重試它們。

默認情況下,如果將 retry 值設置為 true,則重試次數將為3次。您可以通過傳遞這樣的對象來更改它:

axios: {
  retry: { retries: 3 }
}

credentials

  • Default: false

添加攔截器時自動設置 withCredentials,請求axios時配置 baseUrl ,允許將身份驗證頭傳遞給后端

debug

  • Default: false

添加攔截器來記錄請求和響應。

proxyHeaders

  • Default: true

在SSR上下文中,將客戶端請求頭設置為axios的默認請求頭。這對于在服務器端進行需要基于cookie的auth的請求很有用。還有助于在SSR和客戶端代碼中做出一致的請求。

注意:如果在受CloudFlare CDN保護的URL上請求,則應將其設置為false,以防止CloudFlare錯誤地檢測到反向代理循環并返回403錯誤。

proxyHeadersIgnore

  • Default: ['host', 'accept']

只有在 proxyHeaders 設置為true 時才有效。將不需要的請求標頭移除到SSR中的API后端。

附加問題時間:2019-10-9

問題一:很多才接觸的小伙伴不知道怎樣在js文件中使用$axios
答:普通js文件需要在plugins插件目錄中添加一個.js文件,然后在nuxt.config.js插件配置中添加該插件
示例:
plugins目錄添加的
.js

export default (context, inject) => {
  // context.$axios 獲取axios
}

nuxt.config.js Nuxt配置文件

plugins: [
  '~plugins/**',
 '~plugins/**'
]

鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容