Apollo readQuery не работает, даже если целевой объект присутствует?

Я работаю над вызовом 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"
    }
  }
}

Вы пробовали это без Resolution:, поскольку это похоже на префикс, который apollo добавляет к каждому идентификатору. Используйте тот же id, что и при запросе.

Andreas Köberle 15.04.2018 22:05

Да, я пробовал оба способа, с добавлением «Разрешение:» к идентификатору и без него.

VikR 15.04.2018 22:06

Какое __typename у вашего объекта разрешения? Возможно, вместо этого используйте readFragment: apollographql.com/docs/react/advanced/caching.html#readfragm‌ ent

A. Moynet 15.04.2018 22:17

Типовое имя объекта, который я ищу с помощью readQuery, - «Разрешение». Разве я не смогу найти его только с помощью readQuery?

VikR 15.04.2018 22:35

Я только что обновил исходный пост, добавив снимок всего хранилища данных GraphQL с помощью инструментов разработчика GraphQL для Chrome. Предоставляет ли это дополнительную информацию о том, почему мой вызов readQuery еще не работает?

VikR 15.04.2018 23:08

Во-первых, мне кажется неправильным ставить перед идентификатором префикс «Разрешение». Тогда возникает вопрос, чем заполнено ваше хранилище данных? Чтобы прочитать запрос из кеша, запрос должен быть вызван с точно такими же аргументами в удаленном API раньше. Чтобы обойти это и разрешить запрос локально, вы можете реализовать преобразователь кеша. Взгляните на пример в документация

Herku 16.04.2018 02:22

@Herku, большое спасибо. Если вы хотите разместить свой комментарий в качестве ответа, я отмечу его как принятый.

VikR 16.04.2018 03:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
2
7
1 760
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Размещено как ответ другим пользователям apollo с похожими проблемами:

Удалите префикс Resolution:, запрос должен принимать только id.

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

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