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,您实际上可以在缓存中亲眼看到:
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,您实际上可以在缓存中亲眼看到: