对于我的 react-native 应用程序,我需要确保在每个 fetch 请求到服务器之前,应该执行下面的用例
-> 检查保存到 redux 的令牌的过期日期。
--> 如果令牌没有过期,应用程序继续fetch
向服务器请求
--> 如果令牌过期,应用程序会立即向用户发出新请求,refresh token
而不会让用户知道。成功刷新令牌后,应用程序继续fetch
向服务器请求
我尝试用 实现中间件redux-thunk
,但我不知道它是否是好的设计。我只需要有经验的人redux
就react
我的中间件代码给我反馈。
这就是我通过调度checkTokenAndFetch
- 动作创建器向服务器发出请求的方式。
url = "https://———————";
requestOptions = {
method: 'GET',
headers: {
'Authorization': 'Bearer ' + this.props.token
}
};
dispatch(authActions.checkTokenAndFetch(url, requestOptions))
.then((data) => {
})
这是动作创建者 - 位于我所在checkTokenAndFetch
的 authActions.js 文件中actions
function checkTokenAndFetch(url, requestOptions){
return dispatch => {
if(authServices.isTokenExpired()){
console.log("TOKEN EXPIRED");
authServices.refreshToken()
.then(
refreshToken => {
var arr = refreshToken.split('.');
decodedToken = base64.decode(arr[1]);
newTokenExpDate = JSON.parse(decodedToken).exp;
dispatch(writeTokenToRedux(refreshToken,newTokenExpDate));
},
error => {
Alert.alert("TOKEN refresh failed","Login Again");
Actions.login();
}
);
}
else{
console.log("TOKEN IS FRESH");
}
return authServices.fetchForUFS(url, requestOptions)
.then(
response => {
return response;
},
error => {
}
)
;
}
}
这是我在令牌过期的情况下调用isTokenExpired
的refreshToken
函数,位于另一个名为 authServices.js 的文件中。
function isTokenExpired(){
var newState = store.getState();
var milliseconds = (new Date).getTime();
var exDate = newState.tokenExpDate;
return milliseconds>exDate*1000
}
function refreshToken(){
var refreshToken = store.getState();
return fetch('https://—————————', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer ' + refreshToken.token
}
})
.then((response) => {
return response._bodyText;
})
.catch((error) => {
return error;
})
}
以及我fetchForUFS
在 authServices.js 中的函数,用于在完成令牌检查(刷新)内容后调用服务器。
function fetchForUFS(url,requestOptions){
return fetch(url, requestOptions)
.then((response) => {
return response.json();
})
.then((responseData) =>{
return responseData;
})
.catch((error) => {
})
}
我已经阅读了大量的redux-thunk
,redux-promise
和middleware
文档,但我不确定我是否真正实现了中间件逻辑?