«Обнаружены директивы @client в запросе, но не указаны клиентские преобразователи» Предупреждение при использовании клиентского кеша

Я следил за Документы клиента 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;

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

When Apollo Client executes this query and tries to find a result for the isInCart field, it runs through the following steps:

Has a resolver function been set (either through the ApolloClient constructor resolvers parameter or Apollo Client's setResolvers / addResolvers methods) that is associated with the field name isInCart? If yes, run and return the result from the resolver function.

If a matching resolver function can't be found, check the Apollo Client cache to see if a isInCart value can be found directly. If so, return that value.

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

Found @client directives in query but no client resolvers were specified. You can now pass apollo-link-state resolvers to the ApolloClient constructor.

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
18
0
5 876
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

⚠️ If you want to use Apollo Client's @client support to query the cache without using local resolvers, you must pass an empty object into the ApolloClient constructor resolvers option. Without this Apollo Client will not enable its integrated @client support, which means your @client based queries will be passed to the Apollo Client link chain. You can find more details about why this is necessary here.

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

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

Спасибо, я попробовал это, но я все еще получаю предупреждение

Gilly Ames 03.05.2019 15:40

Я беру это обратно - конечно, это работает, просто он не включил клиента в мой MockedProvider, поэтому в моем тесте все еще было предупреждение. Большое спасибо!

Gilly Ames 03.05.2019 16:02

Я могу задать это как другой вопрос, но я добавил клиент здесь <MockedProvider mocks = {mocks} addTypename = {false} client = {client}> и все еще получаю предупреждение в своем тесте. Вы случайно не знаете, где я могу подключить его, пожалуйста?

Gilly Ames 03.05.2019 16:03
Выглядит какresolvers следует передавать напрямую MockedProvider. Что имеет смысл - вы можете поменять местами преобразователи для тестирования.
Daniel Rearden 03.05.2019 16:11

Как позже упомянул Даниэль в комментарии к приведенному выше ответу, передача resolvers = {{}} внутри MockedProvider прекрасно сработала для меня. Вот как это должно выглядеть:

<MockedProvider mocks = {mocks} addTypename = {false} resolvers = {{}}>
    <FooComponent />
</MockedProvider>

Это даже решило проблему с утечкой памяти, которая у меня была в Circle CI, поскольку, похоже, решать было негде; вот сообщения об ошибках, которые я получал:

<--- Last few GCs --->

  154665 ms: Mark-sweep 949.1 (1434.4) -> 948.2 (1434.4) MB, 1979.3 / 0 ms [allocation failure] [GC in old space requested].
  156664 ms: Mark-sweep 948.2 (1434.4) -> 948.2 (1434.4) MB, 1999.7 / 0 ms [allocation failure] [GC in old space requested].
  158734 ms: Mark-sweep 948.2 (1434.4) -> 948.2 (1434.4) MB, 2069.7 / 0 ms [last resort gc].
  160810 ms: Mark-sweep 948.2 (1434.4) -> 948.1 (1434.4) MB, 2075.7 / 0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x30ab306c9fa9 <JS Object>
    2: convertPropertyValueToJson(aka convertPropertyValueToJson) [/home/circleci/project/node_modules/typescript/lib/typescript.js:24737] [pc=0x2953c91d9878] (this=0x30ab30604189 <undefined>,valueExpression=0x39effa032fa9 <a NodeObject with map 0x35eb62463c11>,option=0x30ab30604189 <undefined>)
    3: /* anonymous */(aka /* anonymous */) [/home/circleci/project/node_modules/typescript/lib/type...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
Aborted (core dumped)

Ваше здоровье!

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