Apollo `subscribeToMore` 变量是否必须匹配初始查询?

Does the Apollo `subscribeToMore` variables have to match the initial query?

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

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
        )
    },

通过从客户端发送一个变量?

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

因此,如果您请求 {queryX, limit:2},这将作为与 {queryX, limit:100} 不同的查询进行缓存。

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