带有subscribeToMore的useQuery无法正确过滤

问题描述 投票:1回答:1

目前,我一直试图了解GraphQL订阅问题的时间太长了,我真的很需要帮助。我想理解的是,当您使用subscribeToMore和客户端中的Apollo react钩子来设置订阅时,如下所示:

    const { data, error, loading, subscribeToMore } = useQuery(GET_DATA, {
        variables: {
            status: 'PENDING'
        }
    })

    useEffect(() => {
        const unsubscribe = subscribeToMore({
            variables: {
                status: "PENDING"
            },
            document: SUBSCRIPTION,
            updateQuery: (prev, { subscriptionData }) => {
                if (!subscriptionData.data) return prev

                // subscription logic 
                return {
                    newSubscriptionData,
                }       
            }
        })
        return () => unsubscribe();
    }, [])

是通过subscribeToMore返回的任何新信息,在这种情况下是newSubscriptionData对象,从data开始的查询useQuery是什么?

更具体地说,假设查询GET_DATA是从其他人那里获取用户的所有关注请求。这是通过data中的useQuery来的。假设还有另一个关注请求,在这种情况下,>

  1. 跟随请求突变解析器中的pubsub接管,
  2. 通过关注请求订阅解析器
  3. 返回到subscribeToMore所在的客户端。
  4. [我的问题是,当subscribeToMore返回此新到达的订阅数据时,这是否返回到datauseQuery?如果没有,该如何使用useEffect挂钩中的这些新到达数据?

我问的原因是因为我对此朋友请求查询的变量是我只想获取具有PENDING状态的查询结果,而不是ACCEPTEDNONE这是默认状态,或者当有人取消请求。最初安装组件时,useQuery仅以应有的状态检索具有PENDING状态的跟随请求。但是,当通过订阅收到新请求时,PENDINGNONE(当用户取消请求时,不是一起取消)都来自datauseQuery

我将useQuerysubscribeToMore的变量都设置为专门只获得PENDING状态。我设置了withFilter,以便仅通过PENDING。当我从subscriptionData登录subscribeToMore时,我仅获得PENDING状态,并且没有其他状态通过,因此我知道过滤器工作正常。仅当我从data登录useQuery时,我同时获得了PENDINGNONE,这没有任何意义。

subscribe: withFilter(
            (parent, args, { pubsub }, info) => pubsub.asyncIterator(PUBSUB_NEW_FRIEND_REQUEST),
            (payload, variables) => {
                return payload.newFriendRequest.status === variables.status
            }
        )

我在突变解析器中设置了pubsub

pubsub.publish(PUBSUB_NEW_MUTATION, {
    subscriptionExample: result
})

UPDATE

这里是@Max请求的查询:

query FindFriendRequestRecieved($id: ID, $status: String) {
  findFriendRequestRecieved(
      data: {
        id: $id
        status: $status
      }
    ){
    id
    from {
      id
      username
      email
      image
      updatedAt
    }
    status
  }
}
async findFriendshipRequestRecieved(parent, { data }, { request, prisma }, info) {
        const user = await getUserId(request)
        if (!user.email) {
            throw new Error('You must be logged in!')
        }
        const { id, status } = data
        const opArgs = {}
        if (id) {
            if (status) {
                opArgs.where = {
                    AND: [{
                        to: {
                            email: user.email
                        }
                    }, {
                        from: {
                            id: id
                        }
                    }, {
                        status,
                    }],
                }
            } else {
                opArgs.where = {
                    AND: [{
                        to: {
                            email: user.email
                        }
                    }, {
                        from: {
                            id: id
                        }
                    }],
                }
            }
        } else {
            if (status) {
                opArgs.where = {
                    AND: [{
                        to: {
                            email: user.email
                        }
                    }, {
                        status,
                    }]
                }
            } else {
                opArgs.where = {
                    AND: [{
                        to: {
                            email: user.email
                        }
                    }]
                }
            }
        }


        return prisma.query.friendshipRequestSents(opArgs, info)
    },

目前,我一直试图了解GraphQL订阅问题的时间太长了,我真的很需要帮助。当您使用...

javascript reactjs react-native graphql react-apollo
1个回答
0
投票

SubscribeToMore每次订阅返回时都会调用,而不是一次。随通知一起发送的数据可以被使用并直接合并到存储中。这需要使用updateQuery来完成。 updateQuery必须返回与初始查询形状相同的对象,否则它将不起作用。请参见下面的示例:

© www.soinside.com 2019 - 2024. All rights reserved.