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

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

Apollo`subscribeToMore`变量是否必须与初始查询匹配?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
        )
    },

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

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

是的,你的过滤器必须是 一模一样. 原因是缓存是以准确的查询作为这个响应的关键来填充的。

所以如果你要求 {queryX, limit:2} 这是以不同于 {queryX, limit:100}.

如果你使用的是Apollo开发工具,其实你可以自己在缓存中看到。

enter image description here

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