react-native-community/asyncStorage removeItem 导致程序行为异常
react-native-community/asyncStorage removeItem causes program to behave weirdly
我在用户注销期间执行了这个小代码片段。
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
方法,或者在拦截器中,这对我来说似乎没有问题。
我这里做错了什么??请给我一些光..
或者尝试在 removeUser();
之前添加一个 await
?
async function logoutAction(props) {
await removeUser();
props.logoutUser();
}
这个问题很愚蠢,甚至与 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
和 高鵬翔
.
我在用户注销期间执行了这个小代码片段。
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
方法,或者在拦截器中,这对我来说似乎没有问题。
我这里做错了什么??请给我一些光..
或者尝试在 removeUser();
之前添加一个 await
?
async function logoutAction(props) {
await removeUser();
props.logoutUser();
}
这个问题很愚蠢,甚至与 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
和 高鵬翔
.