首页 > 解决方案 > Apollo `subscribeToMore` 变量是否必须与初始查询匹配?

问题描述

ApollosubscribeToMore变量是否必须与初始查询匹配?例如,如果我的初始查询是

const { data, loading, error } = useQuery(INBOX)

其中变量来自服务器中验证的 id(不是从客户端发送的)

     async inbox(parent, args, { request, prisma }, info) {
        const id = await getUserId(request)
        if (!user.email) {
            throw new Error('You must be logged in!')
        }
        return prisma.query.user({
            where: {
                id,
            }
        },info)
     }

如果订阅解析器如下所示:

   newInbox: {
        subscribe: (parent, args, { pubsub }, info) => pubsub.asyncIterator(PUBSUB_NEW_INBOX)
    },

由于订阅本身没有过滤变量,订阅数据是否会被发送到数据库中的每个客户端,或者它是否会识别出初始查询已经有自己的变量?

换句话说,有必要做如下的事情吗?

 newInbox: {
        subscribe: withFilter(
            (parent, args, { pubsub }, info) => pubsub.asyncIterator(PUBSUB_NEW_INBOX),
            (payload, variables) => payload.newInbox.id === variables.id
        )
    },

通过从客户端发送变量?

标签: reactjsreact-nativegraphqlapolloreact-apollo

解决方案


是的,您的过滤器必须完全相同。这样做的原因是缓存中填充了确切的查询作为此响应的键。

因此,如果您要求{queryX, limit:2}它被缓存为与{queryX, limit:100}.

如果您使用的是 Apollo Dev Tools,您实际上可以在缓存中看到这一点:

在此处输入图像描述


推荐阅读