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

地址:https://www.homwang.com 歡迎大家性能測(cè)試
交流討論——QQ群號(hào):604203227

?? Axios

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

特性

? 自動(dòng)為客戶端和服務(wù)器端設(shè)置基本URL

? 公開(kāi)功能灾票,以便我們可以輕松地全局設(shè)置身份驗(yàn)證令牌setToken$axios

? 請(qǐng)求基本URL時(shí)自動(dòng)啟用withCredentials

? SSR中的代理請(qǐng)求頭(對(duì)于auth有用)

? 獲取樣式請(qǐng)求

? 在提出請(qǐng)求時(shí)與Nuxt.js Progressbar集成

? 集成 Proxy Module

? 具有自動(dòng)重試請(qǐng)求 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)
    }
  }
}

擴(kuò)展

如果您需要通過(guò)注冊(cè)攔截器和更改全局配置來(lái)自定義axios,則必須創(chuàng)建一個(gè)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插件提供幫助程序礁竞,可以更輕松,更快速地注冊(cè)axios攔截器杉辙。

  • onRequest(config)

  • onResponse(response)

  • onError(err)

  • onRequestError(err)

  • onResponseError(err)

默認(rèn)情況下模捂,這些函數(shù)不必返回任何內(nèi)容。

示例: (plugins/axios.js)

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

獲取樣式請(qǐng)求

Axios插件還支持使用前綴 $ 的樣式方法來(lái)獲取請(qǐng)求:

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

設(shè)置頭部信息

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

Axios實(shí)例有一個(gè)幫助方法蜘矢,可以輕松設(shè)置任何標(biāo)頭狂男。

參數(shù):

  • name: 標(biāo)題的名稱
  • value: 標(biāo)頭的值
  • scopes: 默認(rèn)僅針對(duì)特定類型的請(qǐng)求發(fā)送。
    • Type: 數(shù)組或字符串
    • Defaults: 默認(rèn)所有類型的請(qǐng)求為 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'])

設(shè)置Token

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

Axios實(shí)例有一個(gè)幫助方法品腹,可以輕松設(shè)置全局身份驗(yàn)證標(biāo)頭岖食。

參數(shù):

  • token: 授權(quán)令牌
  • type: 授權(quán)令牌前綴(通常為 Bearer
  • scopes: 默認(rèn)僅針對(duì)特定類型的請(qǐng)求發(fā)送。
    • Type: 數(shù)組或字符串
    • Defaults: 默認(rèn)所有類型的請(qǐng)求為 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)

選項(xiàng)

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

prefix舞吭、hostport

該選項(xiàng)使用在 baseURLbrowserBaseURL

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

prefix 的默認(rèn)值為 /

baseURL

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

在客戶端使用和預(yù)先添加請(qǐng)求的基本URL析珊。

環(huán)境變量 API_URL_BROWSER 可用于覆蓋 browserBaseURL

https

  • Default: false

如果設(shè)置為 truehttp://baseURLbrowserBaseURL 將會(huì)變成 https://

progress

  • Default: true

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

還可以使用 progress 配置禁用每個(gè)請(qǐng)求的進(jìn)度條蔑穴。

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'
  }
}

注意:不需要手動(dòng)注冊(cè) @nuxtjs/proxy 模塊忠寻,但它確實(shí)需要在您的依賴項(xiàng)中。

注意:將 /api 添加到API端點(diǎn)的所有請(qǐng)求中存和。如果需要?jiǎng)h除它奕剃,請(qǐng)使用 /pathRewrite

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

retry

  • Default: false
    • 自動(dòng)攔截失敗的請(qǐng)求,并在每次使用 axios-retry 時(shí)重試它們捐腿。

默認(rèn)情況下纵朋,如果將 retry 值設(shè)置為 true,則重試次數(shù)將為3次茄袖。您可以通過(guò)傳遞這樣的對(duì)象來(lái)更改它:

axios: {
  retry: { retries: 3 }
}

credentials

  • Default: false

添加攔截器時(shí)自動(dòng)設(shè)置 withCredentials操软,請(qǐng)求axios時(shí)配置 baseUrl ,允許將身份驗(yàn)證頭傳遞給后端

debug

  • Default: false

添加攔截器來(lái)記錄請(qǐng)求和響應(yīng)宪祥。

proxyHeaders

  • Default: true

在SSR上下文中聂薪,將客戶端請(qǐng)求頭設(shè)置為axios的默認(rèn)請(qǐng)求頭。這對(duì)于在服務(wù)器端進(jìn)行需要基于cookie的auth的請(qǐng)求很有用品山。還有助于在SSR和客戶端代碼中做出一致的請(qǐng)求。

注意:如果在受CloudFlare CDN保護(hù)的URL上請(qǐng)求烤低,則應(yīng)將其設(shè)置為false肘交,以防止CloudFlare錯(cuò)誤地檢測(cè)到反向代理循環(huán)并返回403錯(cuò)誤。

proxyHeadersIgnore

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

只有在 proxyHeaders 設(shè)置為true 時(shí)才有效扑馁。將不需要的請(qǐng)求標(biāo)頭移除到SSR中的API后端涯呻。

附加問(wèn)題時(shí)間:2019-10-9

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

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

nuxt.config.js Nuxt配置文件

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

鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腻要,一起剝皮案震驚了整個(gè)濱河市复罐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雄家,老刑警劉巖效诅,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異趟济,居然都是意外死亡乱投,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門顷编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)戚炫,“玉大人,你說(shuō)我怎么就攤上這事媳纬∷簦” “怎么了施掏?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茅糜。 經(jīng)常有香客問(wèn)我七芭,道長(zhǎng),這世上最難降的妖魔是什么限匣? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任抖苦,我火速辦了婚禮,結(jié)果婚禮上米死,老公的妹妹穿的比我還像新娘锌历。我一直安慰自己,他們只是感情好峦筒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布究西。 她就那樣靜靜地躺著,像睡著了一般物喷。 火紅的嫁衣襯著肌膚如雪卤材。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天峦失,我揣著相機(jī)與錄音扇丛,去河邊找鬼。 笑死尉辑,一個(gè)胖子當(dāng)著我的面吹牛帆精,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隧魄,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卓练,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了购啄?” 一聲冷哼從身側(cè)響起襟企,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狮含,沒(méi)想到半個(gè)月后顽悼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡几迄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年表蝙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓旗。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡府蛇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屿愚,到底是詐尸還是另有隱情汇跨,我是刑警寧澤务荆,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站穷遂,受9級(jí)特大地震影響函匕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚪黑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一盅惜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忌穿,春花似錦抒寂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至朴译,卻和暖如春井佑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眠寿。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工躬翁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盯拱。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓盒发,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坟乾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迹辐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容