Reactjs Apollo Cache-查询字段名返回的未定义类型的对象缺少选择集
我正在用apollo boost构建一个应用程序,它应该已经包含了一些包,可以用graphql来制作react应用程序 当我想将数据片段存储到Apollo缓存中时,我遇到了一个错误 ApolloClient.tsxReactjs Apollo Cache-查询字段名返回的未定义类型的对象缺少选择集,reactjs,graphql,react-apollo,apollo-client,Reactjs,Graphql,React Apollo,Apollo Client,我正在用apollo boost构建一个应用程序,它应该已经包含了一些包,可以用graphql来制作react应用程序 当我想将数据片段存储到Apollo缓存中时,我遇到了一个错误 ApolloClient.tsx import ApolloClient from 'apollo-boost' import { InMemoryCache } from 'apollo-cache-inmemory' import { secretToken } from './secretToken' co
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)
这总是陷入这样的错误中:
查询字段名返回的未定义类型的对象缺少选择集
如果我只处理一段数据,比如name:'Mario'
,它可以完美地工作并检索该段数据,但对于更深层的对象或数组,它总是会失败,并出现此错误
我也在使用打字脚本
知道会是什么吗?堆栈溢出向我展示了几个不起作用的答案,GitHub也没有为我提供解决方案
编辑
因此,这里是我的真实例子,以使其更接近我的真实问题:
<Query
query={fetchdata}
onCompleted={({ repository }) => client.writeData({
data: {
issues: repository.issues.edges
}
})
}
>
client.writeData({
数据:{
问题:repository.issues.edges
}
})
}
>
基本上我是在做一个查询,一旦查询完成,我想把它存储在缓存中,因为我要多次检查它,以比较和过滤一些结果
我尝试了使用存储库
,但仍然出现相同的错误
为了检索数据,我正在执行与上面相同的操作,但是使用了
问题
而不是名称
,文档可以更好地强调这一点,但是存储在缓存中的对象应该始终具有适当的\uu类型名称
。此外,如果要在缓存中存储多个相同类型的对象,则应包含id
属性,以确保为每个项生成唯一的缓存键。换句话说,您的初始状态应为:
names: [
{
__typename: 'Name',
id: 0,
firstName: 'Mario',
},
{
__typename: 'Name',
id: 1,
firstName: 'Luigi'
}
]
然后按如下方式查询状态:
query namesCached {
names @client {
firstName
}
}
names: [
'Mario',
'Luigi',
]
不过,值得一提的是,除非您正在存储对象,否则上述内容是不必要的。如果您使用的是标量,如下所示:
query namesCached {
names @client {
firstName
}
}
names: [
'Mario',
'Luigi',
]
那么您就不需要选择集:
query namesCached {
names @client
}
文档可以更好地强调这一点,但存储在缓存中的对象应该始终具有适当的
\uuu typename
。此外,如果要在缓存中存储多个相同类型的对象,则应包含id
属性,以确保为每个项生成唯一的缓存键。换句话说,您的初始状态应为:
names: [
{
__typename: 'Name',
id: 0,
firstName: 'Mario',
},
{
__typename: 'Name',
id: 1,
firstName: 'Luigi'
}
]
然后按如下方式查询状态:
query namesCached {
names @client {
firstName
}
}
names: [
'Mario',
'Luigi',
]
不过,值得一提的是,除非您正在存储对象,否则上述内容是不必要的。如果您使用的是标量,如下所示:
query namesCached {
names @client {
firstName
}
}
names: [
'Mario',
'Luigi',
]
那么您就不需要选择集:
query namesCached {
names @client
}
嗨,丹尼尔,我一直在读你在这类话题上的一些答案,所以我很高兴你能抽出时间来帮助我。这个答案真的解释了很多,谢谢。让我更新我的问题,从应用程序中添加我的真实对象(因为Mario和Luigi是一种模拟数据),当您查询
问题时,是否包括选择集(即该字段的子字段)?如果你有可能分享你的回购协议,那就更容易看到所有的代码了。先生!我所有的尊敬:)。我的查询对每个子查询都有_typename(因为它来自graphql本身),但没有指定我要在那里检索哪些对象(id、或firstName、或age等等)。我一直在查文档,解释的地方在哪里,但没有找到。你介意把文档发给我吗?它们解释了类型名的重要性,以及为什么缓存需要一个唯一的键,比如id?再次:谢谢:)嗨,丹尼尔,我一直在读你在这类话题上的一些答案,所以我很高兴你能抽出时间来帮助我。这个答案真的解释了很多,谢谢。让我更新我的问题,从应用程序中添加我的真实对象(因为Mario和Luigi是一种模拟数据),当您查询问题时,是否包括选择集(即该字段的子字段)?如果你有可能分享你的回购协议,那就更容易看到所有的代码了。先生!我所有的尊敬:)。我的查询对每个子查询都有_typename(因为它来自graphql本身),但没有指定我要在那里检索哪些对象(id、或firstName、或age等等)。我一直在查文档,解释的地方在哪里,但没有找到。你介意把文档发给我吗?它们解释了类型名的重要性,以及为什么缓存需要一个唯一的键,比如id?再次:谢谢:)