我在用户注销时执行了这段小代码。
async function logoutAction(props) {
removeUser();
props.logoutUser();
}
removeUser()里面的功能是...。
export const removeUser = async () => {
try {
await AsyncStorage.removeItem(Constant.storage.user_data);
await AsyncStorage.removeItem(Constant.storage.token);
await AsyncStorage.removeItem(Constant.storage.notification_token);
return true;
} catch (exception) {
return false;
}
}
这将清除本地存储中的用户相关数据.同样。props.logoutUser()
是对reducer的引用调用,它将loggedIn状态设置为false。
我遇到的问题是,如果 removeUser()
函数被调用一次,axios的http请求就不会再进入拦截器,而且每次请求都会抓到一个'undefined'的错误。 如果把这个方法去掉,一切都能正常工作,我可以通过去掉一次拦截器,执行一个请求,然后再添加拦截器,让它进入工作状态,这是我在这里和那里花了几个小时后找到的。
我的拦截器是。
export const requestInterceptor = axios.interceptors.request.use(
async config => {
const token = await getToken();
if (token != '') {
config.headers.Authorization = token;
}
console.log('axios request', config);
return config;
},
error => {
// console.warn('on request error')
return Promise.reject(error);
},
);
export const responseInterceptor = axios.interceptors.response.use(
function(response) {
console.log('axios response', response);
// console.warn('on response success', response.status)
return response;
},
async function(error) {
if (error.response.status === 401) {
//logout user
return;
}
return Promise.reject(error);
},
);
我使用的是 @react-native-community/AsyncStorage
包来维护本地存储。我怀疑问题可能出在 removeItem
方法,但我不确定,因为官方文档中没有包含这个 removeItem
方法,或者在拦截器中,反正我觉得没有问题。
我到底做错了什么?请给我一些启示。
或者可以尝试添加一个 await
之前 removeUser();
?
async function logoutAction(props) {
await removeUser();
props.logoutUser();
}
这个问题相当愚蠢,甚至不涉及到。AsyncStorage
或 removeItem
并作为 Matt Aft
在评论中指出,这是由于在注销时删除了拦截器中的token后的调用所致。因此,将
const token = await getToken();
if (token != '') {
config.headers.Authorization = token;
}
由
await getToken()
.then(token => {
config.headers.Authorization = token;
})
.catch(_ => {
console.log('no token');
});
拦截器中的,并返回承诺从。getToken
方法做了这件事,多亏了 Matt
和 高鵬翔
.