response-query: почему этот запрос всегда устарел?
Я настроил ответный запрос с бесконечным устаревшим временем для документов, например:
<ReactQueryConfigProvider config={{
queries: {
staleTime: Infinity
}
}}>
Соответственно, большинство моих запросов никогда не устаревают, за исключением одного, моего запроса "профиль":
const getProfile = async () => {
if (!isAuthenticated()) {
return null;
}
try {
const response = await axios.get('/user/profile');
return response.data;
}
catch (error) {
errorCheck(error);
}
};
export const useProfile = () =>
useQuery('profile', getProfile);
Это запрос, содержащий профиль текущего пользователя. isAuthenticated()
- это синхронный вызов, который проверяет, есть ли у нас токен пользователя (поэтому я не выполняю вызовы API, которые, как я знаю, завершатся ошибкой).
По какой-то причине в окне инструментов разработки response-query этот запрос сразу отображается как устаревший. Я действительно не понимаю, что я делаю по-другому с этим. Есть предложения по отладке этого?
2 ответа
Вот в чем, я думаю, была проблема и как я ее решил.
Потому что я установил
staleTime: Infinity
в моем, я ожидал, что все мои запросы никогда не устареют.
Отличие этого запроса в том, что я делаю его недействительным, когда происходит что-то, не связанное с пользовательским интерфейсом.
В моем коде есть таймер сеанса, который по истечении сеанса вызывает
queryCache.invalidateQueries('profile')
для запуска любого пользовательского интерфейса, отображающего профиль, для повторного рендеринга.
Похоже, что если
invalidateQueries
когда-либо вызывается вне контекста запроса, настройки в
ReactQueryConfigProider
не соблюдаются, поэтому
staleTime
установлено значение по умолчанию, 0.
Чтобы решить эту проблему, для запросов, которые мне нужно сделать недействительными по таймеру, я добавил
{ staletime: Infinity }
к запросу явно:
export const useProfile = () => {
const { data: session } = useSession();
const userId = session?.userId;
return useQuery(['profile', userId], getProfile, { staleTime: Infinity });
};
Я не буду заходить так далеко, чтобы говорить, что это ошибка в response-query, но, похоже, это обходной путь.
Я столкнулся с той же проблемой, и она была вызвана компонентом, у которого был дочерний компонент, который использовал re sponse-query. Проверьте свое дерево компонентов и убедитесь, что ничто не использует useProfile() вне
<ReactQueryConfigProvider>
.