Когда я перемещаюсь с помощью 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: () => {},
});
Это связано с тем, что ваш 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]);
@ggorlen, должно быть, это короткий способ проверить, правдив ли auth.token. Но если я заменю его просто на
[auth.token
], у меня все равно будет та же проблема. Так что думаю бесполезно.