Как я могу использовать Apachelo cacheRedirect с вложенным запросом - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть запрос, который выглядит следующим образом:

export const GET_PROJECT = gql`
  query GetProject($id: String!) {
    homework {
      getProject(id: $id) {
        ...ProjectFields
      }
    }
  }
  ${ProjectFieldsFragment}
`;

Мой InMemoryCache выглядит следующим образом:

const cache = new InMemoryCache({
  dataIdFromObject: ({ id }) => id,
  cacheRedirects: {
    Query: {
      getProject: (_, args, obj) => {
        console.log('Hello world');
      },
    },
  }
});

Приведенное выше перенаправление кэша никогда не срабатывает. Однако, если я изменю его так, чтобы он выглядел следующим образом:

const cache = new InMemoryCache({
  dataIdFromObject: ({ id }) => id,
  cacheRedirects: {
    Query: {
      homework: (_, args, obj) => {
        console.log('Hello world');
      },
    },
  }
});

Он попадет в цель, однако у меня нет ни одного аргумента, переданного во вложенном запросе getProject. Что также сбивает с толку, так это то, что эта функция перенаправления кэша используется для запросов, которые, по-видимому, не должны выполняться, например:

export const SESSION = gql`
  query Session {
    session {
      user {
        id
        fullName
        email
      }
      organizations {
        name
        id
      }
    }
  }
`;

Так что же происходит? Я прибег к использованию readFragment в тех местах, где я хочу, чтобы кэш перенаправлялся, но я бы хотел, чтобы логики c стали централизованными.

1 Ответ

0 голосов
/ 25 апреля 2020

Трудно сказать наверняка с такими проблемами, но я держу пари, что, поскольку вы говорите:

Что также сбивает с толку, так это то, что эта функция перенаправления кэша используется для запросов, которые, казалось бы, не должно быть получено

проблема может быть связана с вашей функцией dataIdFromObject.
Эта функция в конечном итоге решает, будут ли данные считаны из кэша или нет. Вы должны переопределить это, только если у вас есть очень конкретная причина c. Например:

import { InMemoryCache, defaultDataIdFromObject } from 'apollo-cache-inmemory';

// ...

export default new ApolloClient({
    link,
    cache: new InMemoryCache({
        dataIdFromObject(object) {
            switch (object.__typename) {
                case 'ModifierScale':
                case 'ModifierGroup':
                    return [
                        object.__typename,
                        object.id,
                        ...object.defaults
                            .map((defaultModifier) => defaultModifier.id)
                            .join(''),
                    ].join('');
                default:
                    return defaultDataIdFromObject(object); // fall back to default handling
            }
        },
    }),
});

Смысл этого параметра состоит в том, чтобы позволить вам настроить key, который помещается в кэш при загрузке данных.

Если это не так Чтобы решить вашу проблему, я бы определенно go во вкладку Apollo в инструментах chrome dev (для этого вам понадобится расширение Apollo dev tools chrome) и посмотрел раздел кеша. Он должен показать вам данные в кеше и ключ, в котором они хранятся.

...