我有这个函数动作
export function unlinkAccount(id) {
return function(dispatch) {
const data = {
id: id
};
return userApi
.post('/user/account/unlink', data)
.then(res => console.log('SUCCESS: unlinkAccount -> ', res))
.catch(err => console.log('ERROR: unlinkAccount -> ', err));
};
}但是我也截取了下面的请求
userApi.interceptors.request.use(
async config => {
const jwtToken = await refreshToken();
if (jwtToken) {
config.data = { accessToken: jwtToken };
}
return config;
},
error => {
return Promise.reject(error);
}
);这将使用来自拦截器的数据而不是unlinkAccount函数向userApi发出POST。当我需要按照以下格式传递数据时,有没有办法将这两种数据组合在一起,或者作为'props‘传递给unlinkAccount函数?
const data = {
id: id,
accessToken: jwtToken
}谢谢。
发布于 2020-01-17 11:30:14
是的,只要找出解决方案,我只需将拦截器请求中的config.data更改为
if (jwtToken) {
config.data = { accessToken: jwtToken, ...config.data };
}因此,它将从组件中获取数据,并在创建POST之前合并截取数据。
发布于 2020-01-17 11:13:49
以下是我在过去所做的:
我认为,每次调用api时传递jwtToken都不是一个好方法。如果你使用下面的方法,你只需要
const data = {
id: id
};
return userApi
.post('/user/account/unlink', data)而且,你不需要每次都调用refreshToken。
import axios from 'axios';
import { store } from '../index';
import { updateAuth } from '../redux/actions/auth';
import { apiURL } from '../config';
axios.defaults.baseURL = apiURL;
// Add a request interceptor
axios.interceptors.request.use(
(config) => {
const { tokenType, accessToken, loggedIn } = store.getState().auth;
const token = `${tokenType} ${accessToken}`;
if (loggedIn) {
config.headers['Authorization'] = token;
}
config.headers['Content-Type'] = 'application/json';
return config;
},
(error) => {
Promise.reject(error);
}
);
//Add a response interceptor
axios.interceptors.response.use(
(response) => {
return response;
},
function(error) {
const originalRequest = error.config;
if (
error.response.status === 401 &&
(originalRequest.url === `${apiURL}auth/login` ||
originalRequest.url === `${apiURL}auth/refresh-token`)
) {
// router.history.push('/auth/login');
return Promise.reject(error);
}
if (error.response.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
const { refreshToken } = store.getState().auth;
const { email } = store.getState().user;
return axios
.post('/auth/refresh-token', {
email,
refreshToken
})
.then((response) => {
const { data: res } = response;
if (res.code === 200) {
store.dispatch(updateAuth({ ...res.token }));
const { tokenType, accessToken } = res.token;
axios.defaults.headers.common[
'Authorization'
] = `${tokenType} ${accessToken}`;
return axios(originalRequest);
}
});
}
return Promise.reject(error);
}
);
export default axios;https://stackoverflow.com/questions/59780635
复制相似问题