【问题标题】:Apollo Client updateQuery Missing field [fieldName] in {}Apollo 客户端 updateQuery {} 中缺少字段 [fieldName]
【发布时间】:2020-02-03 18:34:51
【问题描述】:

在特定的 Query subscribeToMore 函数上,我似乎无法让 Query 获取新数据。

        updateQuery: async (prev, { subscriptionData } ) => {
            const posts = [
                ...prev.getPosts,
                subscriptionData.data.postCreated
            ];
            const result = {
                ...prev,
                count: posts.length,
                getPosts: posts
            }
            return result;
        }

这会导致以下错误:

{} 中缺少字段 getPosts

如果我记录我得到的结果:

对象 { getPosts: (3) […], count: 3 }

我不确定是什么原因造成的,因为在其他几个 updateQuery 调用中似乎还不错。尤其是这一个似乎打破了。

有问题的查询:

export const POST_CREATED = gql`    
    subscription postCreated($authorId: ID!){
        postCreated(authorId: $authorId){
            id, title, createdAt, published
        }
    } `;

export const GET_POSTS = gql`
    query getPosts($authorId: ID!){
        getPosts(authorId: $authorId){
            id, title, createdAt, published
        }
    } `;

【问题讨论】:

  • 这看起来有点奇怪——我不希望count 位于根级别。有问题的实际查询是什么?
  • 只是一个 getPosts 查询,这样它就会返回 [Post!]。我已确保发布回复包含相同的信息。
  • 您能幽默一下并编辑问题以包含实际查询吗?我怀疑您返回的对象与您的实际查询不匹配,但如果没有看到查询,我无法确认
  • 完成。有趣的是,即使我只是简单地编辑 updateQuery 以立即返回 prev(这样数据相同),它仍然会导致相同的错误。
  • 是的,确实很奇怪。我相信当您尝试写入缓存查询但field you're writing isn't in the cache 时会引发错误。是否有任何突变也在更新缓存中的同一查询?我想知道代码中其他地方的 writeQuery 是否会弄乱缓存。

标签: reactjs graphql apollo react-apollo


【解决方案1】:

遇到了同样的问题。 我修复了它,因为返回对象是错误的。 由于您只是将帖子添加到末尾,因此应该可以:

updateQuery: async (prev, { subscriptionData } ) => {
        prev.getPosts.push(subscriptionData.data.postCreated)
        return prev;
    }

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 2018-07-08
    • 2020-12-10
    • 2020-05-05
    • 2021-11-08
    • 2020-12-20
    • 2018-09-09
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多