将嵌套对象写入Apollo客户端缓存

时间:2019-03-07 14:53:27

标签: javascript graphql apollo apollo-client

我正在尝试将嵌套对象写入阿波罗缓存,但是它不起作用。简单的变量写工作正常。我正在使用Apollo-client v2.4

// Schema
const GET_DATA_FROM_CACHE = gql `
  name
  address
  age
`
// Reading data from cache
  render() {
    return (
    <Query query = {GET_DATA_FROM_CACHE} fetchPolicy = {"cache-only"}>
      {({ data }) => (
        <View >
          <Text> Name: {data.name} </Text>
        </View>
      )}
    </Query>
   )
  }

// THIS WORKS as I can see the name in my Text field

client.writeData({
  data: {
    name: 'mr x',
    age: 25
  }
})

// THROWS ERROR: "cannot read property country of undefined"

client.writeData({
  data: {
    name: 'mr x',
    address: {
      country: 'y',
      city: 'z'
    },
    age: 25
  }
})

1 个答案:

答案 0 :(得分:1)

我遇到了这个问题,并通过确保在嵌套对象中包含一个具有适当值的__typename字段来解决了该问题。例如:

client.writeData({
  data: {
    name: 'mr x',
    address: {
      id: 1,
      country: 'y',
      city: 'z',
      __typename: "Address"
    },
    age: 25
  }
})

我还要补充一点,包括一个'id'字段是一个好主意(除非您已经配置了getIdFromObject选项)。在Apollo的Cache Normalization section中有更多信息。

作为参考,我得到的错误是:

  

不变违反:存储错误:应用程序尝试写入   没有提供ID的对象,但商店已包含ID   {Typename}:此对象的{id}。