2

我对 GraphQL 很陌生。我在带有 apollo 的 Vue.js 项目中使用 graph.cool。

  • 我现在正在使用内存缓存。
  • 我以前有一个简单的“allPosts”查询。
  • 在创建一个新的之后,我使用了 update() 钩子和 readQuery() + writeQuery()

但是我希望登录的用户只能看到他们的帖子。所以我用过滤器修改了查询。

query userStreams ($ownerId: ID!) {
  allStreams(filter: {
   owner: {
     id: $ownerId
   }
  }) {
    id
    name
    url
    progress
    duration
    watched
    owner {
      id
    }
  }
}

我的想法是,我只需要传入 userid 变量。但是,这是行不通的。我总是得到

Error: Can't find field allStreams({"filter":{"owner":{}}}) on object (ROOT_QUERY) undefined.




this.$apollo.mutate({
      mutation: CREATE_STREAM,
      variables: {
        name,
        url,
        ownerId
      },
      update: (store, { data: { createStream } }) => {
        const data = store.readQuery({
          query: USERSTREAMS,
          variables: {
            id: ownerId
          }
        })
        data.allStreams.push(createStream)
        store.writeQuery({
          query: USER_STREAMS,
          variables: {
            id: ownerId
          },
          data
        })
      }
    })
4

1 回答 1

2

使用 readQuery 或 writeQuery 时,应使用相同的变量名。所以更换

  variables: { id: ownerId }

  variables: { ownerId }

此外,您收到异常的原因是,如果数据不在存储中,readQuery 会引发异常。这发生在您第一次使用 writeQuery(或使用其他查询获取数据)之前。

您可以在调用此突变之前将一些默认值写入存储。

您还可以使用返回 null 而不是抛出异常的 readFragment。但这需要对您的代码进行更多更改。

于 2018-02-26T14:04:54.780 回答