【发布时间】:2019-09-22 00:39:50
【问题描述】:
我一直在关注当地的Apollo Client docs。
我已经实现了一个非常简单的客户端缓存查询:
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 Client 执行此查询并尝试为 isInCart 字段查找结果时,它会运行以下步骤:
是否设置了与字段名称 isInCart 关联的解析器函数(通过 ApolloClient 构造函数 resolvers 参数或 Apollo Client 的 setResolvers / addResolvers 方法)?如果是,则运行并从解析器函数返回结果。
如果找不到匹配的解析器函数,请检查 Apollo 客户端缓存以查看是否可以直接找到 isInCart 值。如果是,则返回该值。
然而,尽管代码运行良好(它获取我想要的值没问题)我仍然收到这个警告:
在查询中找到 @client 指令,但未指定客户端解析器。您现在可以将 apollo-link-state 解析器传递给 ApolloClient 构造函数。
我误会了吗?我应该以某种方式为此添加客户端解析器吗?
任何建议表示赞赏
【问题讨论】:
标签: javascript reactjs graphql apollo-client