#reactjs #react-router #axios #connected-react-router
#reactjs #реагировать-маршрутизатор #axios #подключенный-реагирующий-маршрутизатор
Вопрос:
У меня есть эта сага для извлечения токена из localStorage и автоматического входа пользователя
export function* authCheckState(action) {
const token = localStorage.getItem("jwt");
const expDate = localStorage.getItem("expDate");
if (!token) {
yield put(actions.logout());
} else {
const expirationDate = new Date(expDate);
if (expirationDate <= new Date()) {
yield put(actions.logout());
} else {
axios.defaults.headers.common['Authorization'] = token;
const username = localStorage.getItem('username');
// const loggedInUser = yield axios.get(`/users/${username}`);
// console.log('HERE');
yield put(actions.loginSuccess());
yield put(
actions.fireTimeout(
(expirationDate.getTime() - new Date().getTime())
// 10 * 1000 // ms
)
);
}
}
}
Поэтому, если я посещаю какой-либо путь в приложении, например, «/ users», он остается неизменным после выполнения saga.
теперь приведенный выше код, как есть, работает отлично. Однако теперь я хочу добавить вызов axios, чтобы получить некоторые данные, подобные этому:
const loggedInUser = yield axios.get(`/users/${username}`);
// store it in the store.
Когда я добавляю этот вызов axios. Я перенаправляюсь на домашнюю страницу «/».
Перед: работает
После: происходит неработающее перенаправление
Комментарии:
1. Не уверен, что это как-то связано с изменением вашего маршрутизатора, но вы должны использовать api ‘call’ из saga при выполнении запроса axios.
Ответ №1:
Я хотел прокомментировать, но не смог из-за меньшего количества баллов, возможно, вам следует использовать
yield call (Api.fetchUser,username)
где Api.fetchUser
— это функция, которая внутренне обращается к rest api и возвращает обещание.
Ответ №2:
Забавно, я изменил порядок вызова, и теперь он работает правильно!!
yield put(actions.loginSuccess());
const loggedInUser = yield axios.get(`/users/${username}`);
yield put(actions.loginSuccess(username, loggedInUser.data));