目前,我一直试图了解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
来的。假设还有另一个关注请求,在这种情况下,>
pubsub
接管,subscribeToMore
所在的客户端。[我的问题是,当subscribeToMore
返回此新到达的订阅数据时,这是否返回到data
的useQuery
?如果没有,该如何使用useEffect
挂钩中的这些新到达数据?
我问的原因是因为我对此朋友请求查询的变量是我只想获取具有PENDING
状态的查询结果,而不是ACCEPTED
或NONE
这是默认状态,或者当有人取消请求。最初安装组件时,useQuery
仅以应有的状态检索具有PENDING
状态的跟随请求。但是,当通过订阅收到新请求时,PENDING
和NONE
(当用户取消请求时,不是一起取消)都来自data
的useQuery
。
我将useQuery
和subscribeToMore
的变量都设置为专门只获得PENDING
状态。我设置了withFilter
,以便仅通过PENDING
。当我从subscriptionData
登录subscribeToMore
时,我仅获得PENDING
状态,并且没有其他状态通过,因此我知道过滤器工作正常。仅当我从data
登录useQuery
时,我同时获得了PENDING
和NONE
,这没有任何意义。
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订阅问题的时间太长了,我真的很需要帮助。当您使用...
SubscribeToMore每次订阅返回时都会调用,而不是一次。随通知一起发送的数据可以被使用并直接合并到存储中。这需要使用updateQuery来完成。 updateQuery必须返回与初始查询形状相同的对象,否则它将不起作用。请参见下面的示例: