nuxtjs中如何對axios二次封裝
nuxtjs中對axios二次封裝
plugins文件夾新建request.js
import { Message} from "element-ui";
export default function ({ $axios,redirect,$cookies}) {
//請求域名
if(process.env.NODE_ENV == 'development'){
$axios.baseURL = '';
}else if(process.env.NODE_ENV == 'debug'){
$axios.baseURL = '';
}else if(process.env.NODE_ENV == 'product'){
$axios.baseURL = '';
}
$axios.onRequest(config => {
//此處的$cookies為cookie-universal-nuxt,當然也可以使用其它的緩存工具類
//loginInfo 是登錄態(tài)
const loginInfo = $cookies.get('loginInfo')
//區(qū)分axios的post請求和其它請求 因為post請求為data參數(shù)而get則為params參數(shù)
if(config.method == 'post'){
if(loginInfo && config.data){
//Object.assig為合并對象,將token和其它參數(shù)合并,當然和接口文檔有關,有的是要求
//token放在請求頭中的,依據(jù)接口文檔而定
config.data = Object.assign(config.data,loginInfo)
}
}else{
if(loginInfo && config.params){
config.params = Object.assign(config.params,loginInfo)
}
}
return config
})
$axios.onResponse(response => {
if(process.server){ //判斷是服務端還是客戶端的請求
return response.data
}
//狀態(tài)碼依接口文檔而定
if(!process.server && response.data.code == '401'){
return Message({
type:'error',
message:'您還未登錄',
duration:1500
})
}
if(!process.server && response.data.code == '400'){
Message({
type:'error',
message:response.data.msg,
duration:1500
})
return response.data
}
if(!process.server && response.data.code == '404'){
Message({
type:'error',
message:response.data.msg,
duration:1500
})
return response.data
}
if(!process.server && response.data.code == '200'){
return response.data
}
})
$axios.onRequestError(err => {
console.log(err)
})
$axios.onResponseError(err => {
console.log(err)
})
$axios.onError(error => {
const code = parseInt(error.response && error.response.status)
if (code === 400) {
redirect('/')
}
})
}對api進行同一管理,在plugins文件夾下新建api.js
export default ({$axios},inject) => {
inject('base',(params)=>$axios({
url:'/appapi/config/base',
method:'GET',
params
}))
//多個可以繼續(xù)往后寫inject,inject第一個參數(shù)隨便取名
}在nuxt.config.js中配置
export default {
plugins: [
'@/plugins/request',
'@/plugins/api',
],
}在頁面組件中使用方法
export default{
async asyncData(app){
const list = await app.$base({})
},
//methods中使用可以通過this.$base({})
}axios二次封裝,設置請求、響應攔截器
axios的攔截器非常好用,分為請求攔截器與響應攔截器兩種,一般把攔截器卸載api文件下的xxx.js下,
xxx.js中配置,二次封裝
//對于axios進行二次封裝
import axios from 'axios'
//主要是要用到他的請求和攔截器(為什么要二次封裝)
//1.利用axios對象的方法create,去創(chuàng)建一個axios實例
//2.request就是axios,只不過稍微配置一下
const requests = axios.create({
//配置對象
baseUrl:'/api', //基礎路徑,發(fā)送請求時候,代表基于哪個路徑出現(xiàn)api
//代表請求的時間
timeout:5000,
})對axios函數(shù)配置了一下,下面可以直接用requests,寫攔截器
//1.利用axios對象的方法create,去創(chuàng)建一個axios實例
//2.request就是axios,只不過稍微配置一下
1.請求攔截器,在發(fā)請求之前,請求攔截器可以監(jiān)測到,可以在請求發(fā)出去之前做一些事情
requests.interceptors.request.use((config)=>{
//config 配置對象,對象里面有一個屬性很重要,headers請求
return config
})2.響應攔截器:服務器相應數(shù)據(jù)回來以后,響應攔截器可以監(jiān)測到,可以做一些事情
//響應攔截器
requests.interceptors.response.use((re)=>{
//成功的回調函數(shù):服務器相應數(shù)據(jù)回來以后,響應攔截器可以監(jiān)測到,可以做一些事情
return res.data;
},(error)=>{
//響應失敗的回調函數(shù)
return Promise.reject(new Error('faile')) //終止Promise鏈子
})最后對外暴露就完成了axios二次封裝,設置了兩個攔截器
export default requests;
ps完整代碼
//對于axios進行二次封裝
import axios from 'axios'
//主要是要用到他的請求和攔截器(為什么要二次封裝)
//1.利用axios對象的方法create,去創(chuàng)建一個axios實例
//2.request就是axios,只不過稍微配置一下
const requests = axios.create({
//配置對象
baseUrl:'/api', //基礎路徑,發(fā)送請求時候,代表基于哪個路徑出現(xiàn)api
//代表請求的時間
timeout:5000,
})
//請求攔截器,在發(fā)請求之前,請求攔截器可以監(jiān)測到,可以在請求發(fā)出去之前做一些事情
requests.interceptors.request.use((config)=>{
//config 配置對象,對象里面有一個屬性很重要,headers請求
return config
})
//響應攔截器
requests.interceptors.response.use((re)=>{
//成功的回調函數(shù):服務器相應數(shù)據(jù)回來以后,響應攔截器可以監(jiān)測到,可以做一些事情
return res.data;
},(error)=>{
//響應失敗的回調函數(shù)
return Promise.reject(new Error('faile')) //終止Promise鏈子
})
//對外暴露
export default requests;總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
element自定義 多文件上傳 觸發(fā)多次on-change問題
這篇文章主要介紹了element自定義 多文件上傳 觸發(fā)多次on-change問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
利用vuex-persistedstate將vuex本地存儲實現(xiàn)
這篇文章主要介紹了利用vuex-persistedstate將vuex本地存儲的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04
vue實現(xiàn)的封裝全局filter并統(tǒng)一管理操作示例
這篇文章主要介紹了vue實現(xiàn)的封裝全局filter并統(tǒng)一管理操作,結合實例形式詳細分析了vue封裝全局filter及相關使用技巧,需要的朋友可以參考下2020-02-02
vue使用keep-alive實現(xiàn)組件切換時保存原組件數(shù)據(jù)方法
這篇文章主要介紹了vue使用keep-alive實現(xiàn)組件切換時保存原組件數(shù)據(jù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
vue中props賦值給data出現(xiàn)的問題及解決
這篇文章主要介紹了vue中props賦值給data出現(xiàn)的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
Vue $attrs & inheritAttr實現(xiàn)button禁用效果案例
這篇文章主要介紹了Vue $attrs & inheritAttr實現(xiàn)button禁用效果案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

