[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 時掛載攔截器,避免掉套件存取不到問題。
但相信應該有更好的做法,如果有任何建議請留言告訴我~