javascript - 从拦截器重复请求后,axios结果未定义
问题描述
我正在尝试实现一个拦截器来刷新过期令牌并重试最新请求。它在大多数情况下都有效,但是重试原始请求时res
未定义
这是我最初的要求
this.$http.post('/auth/verify')
.then((res) => {
this.$store.commit('login', res.data);
})
.catch((e) => {
console.error(`Error during verify: ${e}`);
});
这是我使用的拦截器
axios.interceptors.response.use(null, (err) => {
if (err.response && err.response.status === 401 && err.response.data.message.includes('jwt expired')) {
const { refreshToken } = JSON.parse(localStorage.getItem('auth'));
axios.post('/auth/refresh', { refreshToken })
.then((res) => {
axios.defaults.headers.common.Authorization = `Bearer ${res.data.token}`;
err.config.headers.Authorization = `Bearer ${res.data.token}`;
localStorage.setItem('auth', JSON.stringify({
refreshToken,
token: res.data.token,
}));
return axios(err.config);
})
.catch((e) => {
console.error(`Error refreshing token: ${e}`);
});
} else {
return Promise.reject(err);
}
});
就像我说res
的在拦截器之后重试请求后未定义,但是在 chrome devtools 网络选项卡中,第二个请求/auth/verify
通过并返回正确的响应,这意味着第二个验证请求成功。
解决方案
我通过让拦截器返回一个解决了axios(err.config)
推荐阅读
- c# - 如何将两个数字相乘并得到每两个数字相乘的 SUM?
- d3.js - d3.js v5 桑基粒子
- task - 我应该使用 Task.Wait() 吗?
- android - 如果 AsyncTask 花费的时间太长,操作系统可以停止它吗?
- calendar - 使用谷歌日历管理N个组日历
- php - 关于REGEX提取文本之间的问题
- powershell - Powershell form.acceptbutton 多个动作
- c# - Unity:按下 UI 按钮时如何停止使用“Input.GetMouseButton(0)”?
- c++ - For 循环不会在 C++ Arduino 中停止
- c# - 在 mvc 应用程序中找不到资源 api