【问题标题】:Apollo client is giving me an error of 'store already contains an id' - what does that mean?Apollo 客户端给了我一个错误“商店已经包含一个 id”——这是什么意思?
【发布时间】:2017-06-16 02:31:32
【问题描述】:

在 react native 项目中,我正在创建一个对象,然后将屏幕重定向到新创建的对象的详细信息页面,我收到此错误:

可能的未处理承诺拒绝(id:0): 网络错误:存储错误:应用程序尝试写入未提供 id 的对象,但存储中已包含此对象的 XYZ id。

查看数据库,我看到该项目在上一步中已正确创建。通过列表导航到同一屏幕和项目(不是在创建和重定向之后)似乎工作正常。我是否必须等待或以某种方式设置某种时间以使阿波罗商店保持正确?

我正在使用标准的 apollo 客户端 @graphql 绑定/包装

gql:

 query getEvent($eventId: ID!) {
    Event(id:$eventId) {
      id
      headline
      photo
      location
      startTime
      creator {
        username
        photo
      }
    }
  }
`;

这是一个代码 sn-p

@graphql(getEventGql,{
  options: ({route}) => {
    console.log('route params', route.params);
    return {
      variables: {
        eventId: route.params.eventId,
      }
    }
  },
})

@connect((state) => ({ user: state.user }))
export default class EventDetailScreen extends Component {
...

【问题讨论】:

    标签: graphql react-apollo apollo-client


    【解决方案1】:

    您还必须将id 添加到creator 字段:

    query getEvent($eventId: ID!) {
        Event(id:$eventId) {
          id
          headline
          photo
          location
          startTime
          creator {
            id
            username
            photo
          }
        }
      }
    

    一般来说,请确保将id 添加到查询的所有子选择中。

    【讨论】:

    • 在嵌套属性中不需要 id 但需要根级别的 id 时出现此错误,因此此答案很有帮助。不过,我希望能解释一下原因。
    • @ABCD.ca 我不是 100% 确定,但似乎正在进行一些结果缓存,因此您必须为 apollo 客户端提供唯一标识符才能检索它。有一定道理,但我在1.0.0发布之前没有遇到过这个问题,所以我暂时恢复到0.10.1
    • 还要小心包含__typename,或者如果您使用 MockProvider 进行测试,请避免使用它。但在某些情况下,您必须在 MockProvider 中包含 __typename 允许它
    猜你喜欢
    • 2018-08-10
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多