Apollo缓存-为查询字段名称返回的类型为undefined的对象缺少选择集

时间:2019-03-04 19:33:10

标签: 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'

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

1 个答案:

答案 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
}