我让这个小代码片段在用户注销期间执行。
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方法,或者在拦截器中,对我来说似乎没有任何错误。
我到底做错了什么?请给我看看光线..
发布于 2020-06-12 15:26:18
这个问题非常愚蠢,甚至与AsyncStorage或removeItem无关,正如Matt Aft在评论中指出的那样,这是由于拦截器中的令牌在注销时被删除后对令牌的调用。所以,替换掉
const token = await getToken();
if (token != '') {
config.headers.Authorization = token;
}通过
await getToken()
.then(token => {
config.headers.Authorization = token;
})
.catch(_ => {
console.log('no token');
});在拦截器中,从getToken方法返回promise完成了这件事。感谢Matt和高鵬翔。
发布于 2020-06-12 14:11:16
或者尝试在removeUser();之前添加一个await?
async function logoutAction(props) {
await removeUser();
props.logoutUser();
}https://stackoverflow.com/questions/62338233
复制相似问题