Я следил за Документы клиента 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.
Я неправильно понял? Должен ли я каким-то образом включать клиентский преобразователь для этого?
Любые советы приветствуются



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Из документы:
⚠️ If you want to use Apollo Client's
@clientsupport to query the cache without using local resolvers, you must pass an empty object into theApolloClientconstructorresolversoption. Without this Apollo Client will not enable its integrated@clientsupport, which means your@clientbased 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: {},
});
Я беру это обратно - конечно, это работает, просто он не включил клиента в мой MockedProvider, поэтому в моем тесте все еще было предупреждение. Большое спасибо!
Я могу задать это как другой вопрос, но я добавил клиент здесь <MockedProvider mocks = {mocks} addTypename = {false} client = {client}> и все еще получаю предупреждение в своем тесте. Вы случайно не знаете, где я могу подключить его, пожалуйста?
resolvers следует передавать напрямую MockedProvider. Что имеет смысл - вы можете поменять местами преобразователи для тестирования.
Как позже упомянул Даниэль в комментарии к приведенному выше ответу, передача 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)
Ваше здоровье!
Спасибо, я попробовал это, но я все еще получаю предупреждение