ApolloGraphQL - ошибка ReadQuery `Поле не найдено`?

Мой readQuery возвращает ошибку field not found, хотя кажется, что поле присутствует в кеше.

ЗАПРОС

const GETIMSFROMCACHE_QUERY = gql`
query getIMsFromCache($fromID: String!){
  instant_message(fromID:$fromID){
    id,
    fromID,
    toID,
    msgText
  }
}  `;

КЭШ-РЕЗОЛЬВЕР

client.cache.cacheResolvers = {
    Query: {
        instant_message: (_, args) => toIdValue(client.dataIdFromObject({
            __typename: 'instant_message',
            id: args.id
        })),
    },
};

ЗВОНОК ПО ЗАПРОСУ, В ОБНОВЛЕНИИ

let instant_message = cache.readQuery({ query: GETIMSFROMCACHE_QUERY, variables: {"fromID": fromID} });

ОШИБКА

Error: Can't find field instant_message({"fromID":"ayqNLcA7c6r8vip3i"}) on object (ROOT_QUERY) {
  "getMyUserData({\"id\":\"ayqNLcA7c6r8vip3i\"})": [
    {
      "type": "id",
      "generated": false,
      "id": "MyUserData:ayqNLcA7c6r8vip3i",
      "typename": "MyUserData"
    }
  ],
  "getMyUserData({\"id\":\"9W95z8A7Y6i34buk7\"})": [
    {
      "type": "id",
      "generated": false,
      "id": "MyUserData:9W95z8A7Y6i34buk7",
      "typename": "MyUserData"
    }
  ],
  "Appts({\"originatingUserID\":\"ayqNLcA7c6r8vip3i\"})": [],
  "instant_message({\"fromID\":\"ayqNLcA7c6r8vip3i\",\"toID\":\"9W95z8A7Y6i34buk7\"})": [
    {
      "type": "id",
      "generated": false,
      "id": "instant_message:126",
      "typename": "instant_message"
    },
    {
      "type": "id",
      "generated": false,
      "id": "instant_message:127",
      "typename": "instant_message"
    },
    {
      "type": "id",
      "generated": false,
      "id": "instant_message:128",
      "typename": "instant_message"
    }
  ]
}.

Глядя на сообщение об ошибке, похоже, что в объекте ROOT_QUERY присутствует объект instant_message с целевым идентификатором пользователя, но я получаю эту ошибку.

Как я могу это исправить?

Заранее спасибо всем за любую информацию.

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

Ответы 1

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

Решено! Это было сложно, потому что обычный преобразователь для исходного запроса возвращает любой IM, который находится в или же от любого из двух пользователей. Резолвер возвращает все мгновенные сообщения от fromID и к toID, или наоборот.

Поэтому я подумал, что мне нужен какой-то преобразователь кеша, чтобы повторить это при запросе кеша.

В конце концов я понял, что кеш-память не заботится о том, что произошло в резолвере - он будет хранить объекты Instant_message как от fromID, так и от toID, независимо от того, что произошло в резолвере.

Как только я понял это, я отбросил специальный запрос преобразователя кеша и просто использовал исходный запрос, который в первую очередь извлекал Instant_messages с теми же переменными запроса, которые использовались с ним в первую очередь, и это сработало. :)

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