«Найдены директивы @client в запросе, но не указаны клиентские распознаватели» Предупреждение при использовании клиентского кэша - PullRequest
3 голосов
/ 03 мая 2019

Я следил за клиентскими документами Apollo в локальном штате.

Я реализовал очень простой запрос кеша клиента:

export const GET_USER_ACCOUNTS = gql`
    query GetUserAccounts {
        userAccounts @client
        name @client
    }
`;

userAccounts и name оба хранятся в моем кэше после аутентификации:

    <Mutation
          mutation={API_TOKEN_AUTHENTICATION}
          variables={{ apiKey }}
          onCompleted={({
              apiTokenAuthentication: {
                  token,
                  userAccounts,
                  user: { givenName, familyName },
               },
          }) => {
             localStorage.setItem('token', token);
             client.writeData({
                 data: {
                     isLoggedIn: true,
                     userAccounts,
                     name: `${givenName} ${familyName}`,
                 },
             });
         }}
    >

и я подогрел кеш значениями по умолчанию:

import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { HttpLink } from 'apollo-link-http';

const cache = new InMemoryCache();
const link = new HttpLink({
    uri: 'http://localhost:8002/v1/graphql',
    headers: {
        Authorization: `${localStorage.getItem('token')}`,
    },
});
const client = new ApolloClient({
    cache,
    link,
});
// set up the initial state
cache.writeData({
    data: {
        name: '',
        userAccounts: [],
        isLoggedIn: !!localStorage.getItem('token'),
    },
});

export default client;

Я не включил никаких локальных распознавателей, так как в документации указано:

Когда клиент Apollo выполняет этот запрос и пытается найти результат для поля isInCart, он выполняет следующие шаги:

Была ли установлена ​​функция распознавателя (либо с помощью параметра преобразователей конструктора ApolloClient, либо с помощью методов setResolvers / addResolvers клиента Apollo), которая связана с именем поля isInCart? Если да, запустите и верните результат из функции распознавателя.

Если не удается найти подходящую функцию распознавателя, проверьте кэш клиента Apollo, чтобы узнать, можно ли напрямую найти значение isInCart. Если это так, верните это значение.

Однако, несмотря на то, что код работает нормально (он выбирает значения, которые мне не нужны), я все равно получаю это предупреждение:

Найдены директивы @client в запросе, но клиентские распознаватели не указаны. Теперь вы можете передавать средства разрешения состояний apollo-link в конструктор ApolloClient.

Я неправильно понял? Должен ли я каким-то образом включить клиентский распознаватель?

Любой совет приветствуется

1 Ответ

7 голосов
/ 03 мая 2019

Из документов :

⚠️ Если вы хотите использовать поддержку @client клиента Apollo для запроса кеша без использования локальных распознавателей, вы должны передать пустой объектв опцию ApolloClient constructor resolvers.Без этого клиент Apollo не включит встроенную поддержку @client, что означает, что ваши запросы на основе @client будут переданы в цепочку ссылок клиента Apollo.Вы можете найти более подробную информацию о том, почему это необходимо здесь .

Другими словами, просто добавьте пустой объект резолверов в вашу конфигурацию, например так:

const client = new ApolloClient({
    cache,
    link,
    resolvers: {},
});
...