后端希望控制台出现401的时候不要出现这种报错信息,但是关键是你返回的状态码是401啊我哭,
一般情况下都是,如果请求正常,响应状态码都是200,权限过期的话就是返回的code为401,此时复习一下状态码的含义:
响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599):
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
but 返回的是
401啊,此401非彼401啊,但是我说不通,于是拉过旁边的后端人员来跟他解释啊哈哈哈。
其实他看了我的代码的,但是他看不懂,因为他之前写的是原生的ajax不是axios。
我的代码结构是这样子的
附上源码:
axios.interceptors.request.use(
(config) => {
let token = window.localStorage.getItem("accessToken");
config.headers.ContentType = "application/json-patch+json"
// 统一改请求头
// axios.defaults.baseURL = 'https://api.example.com';
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
if (token && !config.url?.includes('.ashx')) {
config.headers.Token = token
}
return config
},
(error) => {
return Promise.reject(error);
}
);
//配置响应的拦截器
axios.interceptors.response.use(
(response) => {
// 相同请求不得在600毫秒内重复发送,反之继续执行
const requestData = getRequestIdentify(response.config);
// 请求获得响应后,将该请求从map中移除,以使后面的请求正常发送。
if (requestMap.has(requestData)) {
requestMap.delete(requestData)
}
let data = response;
if (data.data.code === 0) {
return data;
}
if (data.data.code === 401 || data.data.code === 'A0230') { // token过期 权限验证失败
ElMessage.error(data.data.message ? data.data.message : '权限401,token过期')
router.push('/login')
return data
}
// if (data.data.code === 402) { //没有菜单权限
// ElMessage.error(data.data.Msg)
// return data
// }
// if (data.data.code === 400) { //没有项目权限
// // window.location.replace(baseURL + '/login')
// // localStorage.removeItem('token')
// ElMessage.error(data.data.Msg)
// // window.history.go(0)
// return data
// }
return response;
},
(error) => {
if (error && error.response) {
// 1.公共错误处理
// 2.根据响应码具体处理
switch (error.response.status) {
case 400:
error.message = "通用错误";
break;
case 401:
error.message = error.message ? error.message : '权限401,token过期'
localStorage.clear()
router.push('/login')
// localStorage.clear()
break;
case 403:
error.message = "验证失败";
break;
// case 404:
// error.message = "请求错误,未找到该资源";
// // window.location.href = "/NotFound";
// break;
// case 405:
// error.message = "请求方法未允许";
// break;
// case 408:
// error.message = "请求超时";
// break;
// case 500:
// error.message = "服务器端出错";
// break;
// case 501:
// error.message = "网络未实现";
// break;
// case 502:
// error.message = "网络错误";
// break;
// case 503:
// error.message = "服务不可用";
// break;
// case 504:
// error.message = "网络超时";
// break;
// case 505:
// error.message = "http版本不支持该请求";
// break;
default:
error.message = `连接错误${error.response.status}`;
}
} else {
// 超时处理
if (JSON.stringify(error).includes("timeout")) {
error.message = "服务器响应超时,请刷新当前页";
} else {
error.message = "连接服务器失败";
}
}
/***** 处理结束 *****/
ElMessage.closeAll()
ElMessage.error(error.message)
return Promise.resolve(error.response);
}
)
本来是在response里处理的,后来发现他返回的是状态码401,所以才加的
我哭,结果居然让我那个报错我怎么让他不出现,这可真是太为难我啦!!!因为状态码不是2**都会报错哒