Axios делает 2 запроса при обновлении

Когда я перемещаюсь с помощью Link (реагировать на router-dom), у меня нет этой проблемы, но если я обновляю браузер, я получаю сообщение об ошибке 403 в консоли, говорящее о неавторизованном доступе, а затем я получаю данные в следующем запросе с ответом 200. Почему это делает то, что выглядит как 2 запроса при обновлении браузера?

import { AuthContext } from "../../shared/context/auth-context";

const ContactEntries = () => {
const auth = useContext(AuthContext);
  useEffect(() => {
    const source = Axios.CancelToken.source();
    setIsLoading(true);

    const getContactEnquiries = async () => {
      try {
        const response = await Axios.get(
          `${process.env.REACT_APP_BACKEND_URL}/v1/contact`,
          {
            cancelToken: source.token,
            headers: { Authorization: "Bearer " + auth.token },
          }
        );

        if (response.status === 200) {
          setIsLoading(false);
          setEnquiries(response.data.enquiries);
        }
      } catch (err) {
        setIsLoading(false);
        console.info(err.response);
      }
    };

    getContactEnquiries();
    return () => {
      source.cancel();
    };
  }, [!!auth.token]);
}

Вот мой authContext:

import { createContext } from "react";

export const AuthContext = createContext({
  isLoggedIn: false,
  userId: null,
  token: null,
  email: null,
  firstName: null,
  login: () => {},
  logout: () => {},
});

@ggorlen, должно быть, это короткий способ проверить, правдив ли auth.token. Но если я заменю его просто на [auth.token], у меня все равно будет та же проблема. Так что думаю бесполезно.

Waterfall 26.12.2020 16:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это связано с тем, что ваш useEffect запускается дважды при обновлении. При первом рендеринге он не получает auth.token и может быть нулевым. И на втором рендере он делает вызов с кодом состояния 200.

Вы должны проверить, что токен аутентификации успешно прошел.

Вы можете проверить это так

useEffect(() => {
    const source = Axios.CancelToken.source();
    setIsLoading(true);

    const getContactEnquiries = async () => {
      try {
        const response = await Axios.get(
          `${process.env.REACT_APP_BACKEND_URL}/v1/contact`,
          {
            cancelToken: source.token,
            headers: { Authorization: "Bearer " + auth.token },
          }
        );

        if (response.status === 200) {
          setIsLoading(false);
          setEnquiries(response.data.enquiries);
        }
      } catch (err) {
        setIsLoading(false);
        console.info(err.response);
      }
    };
    if (auth.token) getContactEnquiries();
    return () => {
      source.cancel();
    };
  }, [!!auth.token]);

Другие вопросы по теме