如何 Return 基于响应错误代码的自定义 axios 响应
How to Return a custom axios response based on response's error code
我正在尝试在我的 vue 应用程序中进行全局错误处理。我有一个 api.service.js 文件,其中包含我的 axios 和创建我的 get,post 函数:
/**
* Service to call HTTP request via Axios
*/
const ApiService = {
init(apiBaseUrl) {
Vue.use(VueAxios, axios);
Vue.axios.defaults.baseURL = apiBaseUrl;
},
/**
* Set the default HTTP request headers
*/
setHeader() {
Vue.axios.defaults.headers.common[
"Authorization"
] = `Bearer ${JwtService.getToken()}`;
},
setHeaderwToken(token) {
Vue.axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
},
/**
* Send the GET HTTP request
* @param resource
* @param slug
* @returns {*}
*/
get(resource, slug = "") {
var myBlob = new Blob([], {type:'text/plain'});
var init = { status: 200, statusText: "" };
var myResponse = new Response(myBlob, init);
return Vue.axios.get(`${resource}/${slug}`)
.catch((error) => {
if (error.response.status == 401) {
//401 response
if (resource != "CheckToken") {
// request isNot checktoken & 401 response, check if token is valid?
Vue.axios
.get("CheckToken")
.then((CheckTokenResponse) => {
console.log("CheckToken response");
if (CheckTokenResponse.data == "OK") {
//token valid + 401 response
init = { status: 401, statusText: "noAuthorityValid" };
myResponse = new Response(myBlob, init);
console.log(CheckTokenResponse);
console.log("//token valid + 401 response");
console.log(myResponse);
return myResponse;
} else {
init = { status: 401, statusText: "noTokenValid" };
myResponse = new Response(myBlob, init);
console.log(CheckTokenResponse);
console.log("//token NOT valid + 401 response");
return myResponse;
}
})
.catch(() => {
init = { status: 401, statusText: "noTokenValid" };
myResponse = new Response(myBlob, init);
return myResponse;
});
} else {
//request is CheckToken + 401 response
init = { status: 401, statusText: "noTokenValid" };
myResponse = new Response(myBlob, init);
console.log(error);
console.log("//request is CheckToken + 401 response");
return myResponse;
}
} else {
// != 401 response
console.log(error);
console.log("!= 401 response");
return error;
}
});
},
};
export default ApiService;
在我的 Vue 组件中,我正在调用我的 ApiService:
ApiService.get("MyFunction")
.then((response) => {
console.log("MyFunction " + response);
.catch((error) => {
console.log("MyFunction " + error);
});
},
我尝试创建自定义响应 (myResponse) 并 return 但它 return 为 undefined
(我想这是一个错误的方法)
我想要实现的是,
当函数被调用并且 return 来自 api 的错误代码时,
(500, 401, 404..)
我想抓住它,
如果它是 401,那么我想调用“CheckToken”函数,然后如果 CheckToken returns“OK”我想 return“noAuthorityValid”(意味着令牌有效但该函数未经授权。 ), CheckToken 不行,然后我想 return noTokenValid 并且我想在我调用函数的 vue 组件中执行它:
ApiService.get("MyFunction")
.then((response) => {
console.log("MyFunction " + response);
// if (response.statusText == noAuthorityValid)
{
// show snackbar("you are not authorized for this function")
}
})
.catch((error) => {
console.log("MyFunction " + error);
});
},
我无法用 api.service.js 做到这一点,所以我创建了一个漫游。
我在每个需要 axios 调用的组件中导入了 axios;
import axios from "axios";
然后我像这样使用 axios:
axios({
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",
},
url: "MyFunction",
method: "get",
})
.then((response) => {....}
然后,在我的顶级组件(顶级父级)创建的函数中,我使用了 axios.interceptors.response 这样的:
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
this.handleError(error);
return Promise.reject(error);
}
);
这是我的 handleError 函数:
handleError(error) {
if (error.response.status == 401) {
if (error.response.data.includes("expiredToken")) {
this.showSnackbar("Token is expired");
setTimeout(() => {
if (!window.location.href.includes("login")) {
this.$router.push({ name: "login" }).then(() => {
this.$store.dispatch(LOGOUT); //PURGES user data,
});
}
}, 2000);
} else if (
error.response.data.includes(
"UnauthorizedFunction"
)
) {
this.showSnackbar("You are not authorized for this function ");
} else {
this.showSnackbar("Error occured.");
}
} else {
this.showSnackbar("Error occured.");
}
}
这个愚蠢的问题花了我 2.5 天..
我正在尝试在我的 vue 应用程序中进行全局错误处理。我有一个 api.service.js 文件,其中包含我的 axios 和创建我的 get,post 函数:
/**
* Service to call HTTP request via Axios
*/
const ApiService = {
init(apiBaseUrl) {
Vue.use(VueAxios, axios);
Vue.axios.defaults.baseURL = apiBaseUrl;
},
/**
* Set the default HTTP request headers
*/
setHeader() {
Vue.axios.defaults.headers.common[
"Authorization"
] = `Bearer ${JwtService.getToken()}`;
},
setHeaderwToken(token) {
Vue.axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
},
/**
* Send the GET HTTP request
* @param resource
* @param slug
* @returns {*}
*/
get(resource, slug = "") {
var myBlob = new Blob([], {type:'text/plain'});
var init = { status: 200, statusText: "" };
var myResponse = new Response(myBlob, init);
return Vue.axios.get(`${resource}/${slug}`)
.catch((error) => {
if (error.response.status == 401) {
//401 response
if (resource != "CheckToken") {
// request isNot checktoken & 401 response, check if token is valid?
Vue.axios
.get("CheckToken")
.then((CheckTokenResponse) => {
console.log("CheckToken response");
if (CheckTokenResponse.data == "OK") {
//token valid + 401 response
init = { status: 401, statusText: "noAuthorityValid" };
myResponse = new Response(myBlob, init);
console.log(CheckTokenResponse);
console.log("//token valid + 401 response");
console.log(myResponse);
return myResponse;
} else {
init = { status: 401, statusText: "noTokenValid" };
myResponse = new Response(myBlob, init);
console.log(CheckTokenResponse);
console.log("//token NOT valid + 401 response");
return myResponse;
}
})
.catch(() => {
init = { status: 401, statusText: "noTokenValid" };
myResponse = new Response(myBlob, init);
return myResponse;
});
} else {
//request is CheckToken + 401 response
init = { status: 401, statusText: "noTokenValid" };
myResponse = new Response(myBlob, init);
console.log(error);
console.log("//request is CheckToken + 401 response");
return myResponse;
}
} else {
// != 401 response
console.log(error);
console.log("!= 401 response");
return error;
}
});
},
};
export default ApiService;
在我的 Vue 组件中,我正在调用我的 ApiService:
ApiService.get("MyFunction")
.then((response) => {
console.log("MyFunction " + response);
.catch((error) => {
console.log("MyFunction " + error);
});
},
我尝试创建自定义响应 (myResponse) 并 return 但它 return 为 undefined (我想这是一个错误的方法) 我想要实现的是, 当函数被调用并且 return 来自 api 的错误代码时, (500, 401, 404..) 我想抓住它, 如果它是 401,那么我想调用“CheckToken”函数,然后如果 CheckToken returns“OK”我想 return“noAuthorityValid”(意味着令牌有效但该函数未经授权。 ), CheckToken 不行,然后我想 return noTokenValid 并且我想在我调用函数的 vue 组件中执行它:
ApiService.get("MyFunction")
.then((response) => {
console.log("MyFunction " + response);
// if (response.statusText == noAuthorityValid)
{
// show snackbar("you are not authorized for this function")
}
})
.catch((error) => {
console.log("MyFunction " + error);
});
},
我无法用 api.service.js 做到这一点,所以我创建了一个漫游。 我在每个需要 axios 调用的组件中导入了 axios;
import axios from "axios";
然后我像这样使用 axios:
axios({
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",
},
url: "MyFunction",
method: "get",
})
.then((response) => {....}
然后,在我的顶级组件(顶级父级)创建的函数中,我使用了 axios.interceptors.response 这样的:
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
this.handleError(error);
return Promise.reject(error);
}
);
这是我的 handleError 函数:
handleError(error) {
if (error.response.status == 401) {
if (error.response.data.includes("expiredToken")) {
this.showSnackbar("Token is expired");
setTimeout(() => {
if (!window.location.href.includes("login")) {
this.$router.push({ name: "login" }).then(() => {
this.$store.dispatch(LOGOUT); //PURGES user data,
});
}
}, 2000);
} else if (
error.response.data.includes(
"UnauthorizedFunction"
)
) {
this.showSnackbar("You are not authorized for this function ");
} else {
this.showSnackbar("Error occured.");
}
} else {
this.showSnackbar("Error occured.");
}
}
这个愚蠢的问题花了我 2.5 天..