我正在用apollo-boost构建一个应用程序,其中应该已经包含一些软件包,以便使用graphql做一个React应用程序。
我想将数据存储到我的Apollo缓存中时遇到错误。
ApolloClient.tsx
import ApolloClient from 'apollo-boost'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { secretToken } from './secretToken'
const cache = new InMemoryCache({
})
const client = new ApolloClient({
uri: 'https://someUrlIremovedForTheQuestion.com',
request: async operation => {
operation.setContext({
headers: {
Authorization: secretToken
}
})
},
cache
})
client.writeData({
data: {
names: [
{
firstName: 'Mario'
},
{
firstName: 'Luigi'
}
]
}
})
export default client
现在,我正在尝试访问在同一阿波罗配置中在此处创建的这些名称:
MyComponent.tsx
const result = client.readQuery({ query: gql`
query namesCached {
names @client
}`
})
console.log(result)
这总是会导致以下错误:
Missing selection set for object of type undefined returned for query field names
如果我正在处理name: 'Mario'
之类的单个数据,则可以完美工作并检索该数据,但是对于更深的对象或数组,它总是会因该错误而失败。
我也在使用Typescript
有什么想法吗?堆栈溢出向我显示了两个无效的答案,并且GitHub也没有为我提供解决方案...
修改 因此,这是我的真实示例,可以使其更加接近我的真实问题:
<Query
query={fetchdata}
onCompleted={({ repository }) => client.writeData({
data: {
issues: repository.issues.edges
}
})
}
>
基本上,我正在执行查询,一旦完成,我想将其存储在缓存中,因为我要多次检查以比较和过滤一些结果。
我只用repository
尝试过,但仍然遇到相同的错误
要检索数据,我与上述操作相同,只是使用issues
而不是names
答案 0 :(得分:1)
文档可以更好地强调这一点,但是您存储在缓存中的对象应始终具有适当的__typename
。此外,如果要在缓存中存储多个相同类型的对象,则应包括一个id
属性,以确保为每个项目生成唯一的缓存键。换句话说,您的初始状态应为:
names: [
{
__typename: 'Name',
id: 1,
firstName: 'Mario',
},
{
__typename: 'Name',
id: 1,
firstName: 'Luigi'
}
]
然后您可以像这样查询状态:
query namesCached {
names @client {
firstName
}
}
但是,值得一提的是,除非您存储对象,否则不需要上述内容。如果您正在使用标量,则像这样:
names: [
'Mario',
'Luigi',
]
然后,您不需要选择集:
query namesCached {
names @client
}