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

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

QUERY

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

CACHE RESOLVER

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

READQUERY CALL, ОБНОВЛЕНИЕ

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"
    }
  ]
}.

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

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

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

1 ответ

Решение

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

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

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

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

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