вызов yield axios.get() в Saga изменяет путь к местоположению по умолчанию «/»

#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));