На одной из моих страниц в моем приложении я делаю два вызова API с клиентом graphql apollo. Один document, другой menu. Мне нужны данные меню в одном из моих компонентов, поэтому я хочу использовать readQuery, чтобы не получать их снова. Что я делаю:
const client = useApolloClient();
try {
const testData = client.readQuery({
query: gql`
query ($result: String) {
menu(result: $result) {
text
}
}
`,
variables: {
result: „testresult”
},
});
console.info(testData);
} catch(e) {
console.info(e);
}
Что делает graphQL, так это ищет document корневой запрос, поэтому ошибка выглядит так:
Invariant Violation: Can't find field menu({"lang":"en-us"}) on object
{
"document({\"lanf\":\"en-us\",\"id\":\"mySite\"})": {
"type": "id",
"generated": false,
"id": "XO5tyxAAALGzcYGG",
"typename": "Document"
}
}.
Я считаю, что это потому, что данных меню еще нет.
Как я могу ждать, пока он будет там?





Ты прав. Вы получаете сообщение об ошибке, потому что данные еще не в кеше:
The query method, on the other hand, may send a request to your server if the appropriate data is not in your cache whereas readQuery will throw an error if the data is not in your cache. readQuery will always read from the cache.
https://www.apollographql.com/docs/react/advanced/caching/#readquery
Чтобы сделать то, что вы хотите, используйте обычный запрос с cache-onlyfetchPolicy.
https://www.apollographql.com/docs/react/api/react-apollo/#optionsfetchpolicy
Так что я думаю, что cache-first будет более уместным здесь. Спасибо, что помогаете и ставите на правильный путь
Нет, ошибку не выдаст. Когда вы используете useQuery, если нет данных, это все. Вы должны обработать случай отсутствия данных в пользовательском интерфейсе. fetchPolicycache-first — это поведение по умолчанию. Apollo заглянет в кеш и, если данных нет, сделает запрос. В противном случае нет. Итак, чтобы использовать cache-first, просто используйте useQuery, как обычно.
Но не вызовет ли это тоже ошибку? Из документов: если данные для вашего запроса не существуют в кеше, будет выдана ошибка