[axios] interceptor 攔截器


在 axios 實體中可以掛載 interceptor 攔截器,在 request 發出或 response 回來之前攔截加料 (?)。藉此實現統一加入資料、統一 error handling 等操作。

用法也蠻直白簡單,直接看範例就很好理解:

攔截 request

import axios from 'axios';
import store from 'your/store/path/store'
export default function setup() {
    axios.interceptors.request.use(function(config) {
        // do something
        return config;
    }, function(err) {
        return Promise.reject(err);
    });
}

得到的 config 大概長這樣,就是發起請求的完整內容:

{
  "url": "/api",
  "method": "get",
  "params": {
    "id": 1,
  },
  "headers": {
    "common": {
      "Accept": "application/json, text/plain, */*"
    },
    "delete": {},
    "get": {},
    "head": {},
    "post": {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    "put": {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    "patch": {
      "Content-Type": "application/x-www-form-urlencoded"
    }
  },
  "baseURL": "http://172.16.1.183:83",
  "transformRequest": [
    null
  ],
  "transformResponse": [
    null
  ],
  "timeout": 1000,
  "xsrfCookieName": "XSRF-TOKEN",
  "xsrfHeaderName": "X-XSRF-TOKEN",
  "maxContentLength": -1
}

post 情況大同小異,只是 params 以 data 取代:

{
  "url": "/api/login",
  "method": "post",
  "data": {
    "email": "",
    "password": ""
  },
  "headers": {
   ...
  },
  "baseURL": "",
  ...
}

攔截 response,錯誤部分記得要 reject 才會進 catch。

axios.interceptors.response.use(
    response => {
        // do something
        return response
    },
    error => {
        // do something
        return Promise.reject(error)
    }
)

自己遇到的小卡關:

一開始想要把攔截器拉出去獨立 js,但裡面的操作又用到很多 Vue 掛載的套件,諸如 router, store, $vs (vuesax), $acl (vue-acl) 等等,拉出去就各式各樣 undefined 噴出來~

最後的解法是使用全域 Mixin,在 App created 時掛載攔截器,避免掉套件存取不到問題。

但相信應該有更好的做法,如果有任何建議請留言告訴我~


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *