Reactjs Apollo Cache-查询字段名返回的未定义类型的对象缺少选择集

Reactjs 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

我正在用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)
这总是陷入这样的错误中:

查询字段名返回的未定义类型的对象缺少选择集

如果我只处理一段数据,比如
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?再次:谢谢:)