Я работаю над вызовом readQuery. Я получаю сообщение об ошибке:
modules.js?hash=2d0033b4773d9cb6f118946043f7a3d4385825fe:25847
Error: Can't find field resolutions({"id":"Resolution:DHSzPa8bvPCDjuAac"})
on object (ROOT_QUERY) {
"resolutions": [
{
"type": "id",
"id": "Resolution:AepgCCio9KWGkwyMC",
"generated": false
},
{
"type": "id",
"id": "Resolution:DHSzPa8bvPCDjuAac", // <==ID I'M SEEKING
"generated": false
}
],
"user": {
"type": "id",
"id": "User:WWv57KsvqWeAoBNHY",
"generated": false
}
}.
Объект с этим идентификатором явно отображается как вторая запись в списке разрешений.
Вот мой запрос:
const GET_CURRENT_RESOLUTION_AND_GOALS = gql`
query Resolutions($id: String!) {
resolutions(id: $id) {
_id
name
completed
goals {
_id
name
completed
}
}
}
`;
... и вот как я это называю:
<Mutation
mutation = {CREATE_GOAL}
update = {(cache, {data: {createGoal}}) => {
let id = 'Resolution:' + resolutionId;
const {resolutions} = cache.readQuery({
query: GET_CURRENT_RESOLUTION_AND_GOALS,
variables: {
id
},
});
}}
>
Что мне не хватает?
Обновлять
Согласно расширению GraphQL Dev Tools для Chrome, вот все хранилище данных GraphQL:
{
"data": {
"resolutions": [
{
"_id": "AepgCCio9KWGkwyMC",
"name": "testing 123",
"completed": false,
"goals": [
{
"_id": "TXq4nvukpLcqQhMRL",
"name": "test goal abc",
"completed": false,
"__typename": "Goal"
},
],
"__typename": "Resolution"
},
{
"_id": "DHSzPa8bvPCDjuAac",
"name": "testing 345",
"completed": false,
"goals": [
{
"_id": "PEkg5oEEi2tJ6i8LH",
"name": "goal abc",
"completed": false,
"__typename": "Goal"
},
{
"_id": "X4H4dFzGm5gkq5bPE",
"name": "goal bcd",
"completed": false,
"__typename": "Goal"
},
{
"_id": "hYunrXsMq7Gme7Xck",
"name": "goal cde",
"completed": false,
"__typename": "Goal"
}
"__typename": "Resolution"
}
],
"user": {
"_id": "WWv57KsvqWeAoBNHY",
"__typename": "User"
}
}
}
Да, я пробовал оба способа, с добавлением «Разрешение:» к идентификатору и без него.
Какое __typename у вашего объекта разрешения? Возможно, вместо этого используйте readFragment: apollographql.com/docs/react/advanced/caching.html#readfragm ent
Типовое имя объекта, который я ищу с помощью readQuery, - «Разрешение». Разве я не смогу найти его только с помощью readQuery?
Я только что обновил исходный пост, добавив снимок всего хранилища данных GraphQL с помощью инструментов разработчика GraphQL для Chrome. Предоставляет ли это дополнительную информацию о том, почему мой вызов readQuery еще не работает?
Во-первых, мне кажется неправильным ставить перед идентификатором префикс «Разрешение». Тогда возникает вопрос, чем заполнено ваше хранилище данных? Чтобы прочитать запрос из кеша, запрос должен быть вызван с точно такими же аргументами в удаленном API раньше. Чтобы обойти это и разрешить запрос локально, вы можете реализовать преобразователь кеша. Взгляните на пример в документация
@Herku, большое спасибо. Если вы хотите разместить свой комментарий в качестве ответа, я отмечу его как принятый.


Размещено как ответ другим пользователям apollo с похожими проблемами:
Удалите префикс Resolution:, запрос должен принимать только id.
Тогда возникает вопрос, чем заполнено ваше хранилище данных?
Чтобы прочитать запрос из кеша, запрос должен быть вызван с точно такими же аргументами в удаленном API раньше. Таким образом, apollo знает, каков результат для поля с конкретными аргументами. Если вы никогда не вызывали удаленную конечную точку с аргументами, которые хотите использовать, но знаете, каков будет результат, вы можете обойти это и разрешить запрос локально, реализовав преобразователь кеша. Взгляните на пример в документация. Здесь магазин содержит список книг (в вашем случае resultions), и запрос отдельной книги по идентификатору может быть решен с помощью простого поиска в кеше.
Вы пробовали это без
Resolution:, поскольку это похоже на префикс, который apollo добавляет к каждому идентификатору. Используйте тот жеid, что и при запросе.