Должны ли переменные Apollo `subscribeToMore` соответствовать исходному запросу? - PullRequest
0 голосов
/ 06 апреля 2020

Должны ли переменные Apollo subscribeToMore соответствовать исходному запросу? Например, если мой начальный запрос

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

, где переменная от идентификатора, подтвержденного на сервере (не отправлено с клиента)

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

будут ли данные подписки отправляться каждому клиенту в базе данных, так как сама подписка не имеет переменной фильтрации, или она распознает, что первоначальный запрос уже имел переменную своего own?

Другими словами, необходимо сделать что-то вроде следующего?

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

, отправив переменную от клиента?

1 Ответ

1 голос
/ 02 мая 2020

Да, ваши фильтры должны быть точно такими же . Причина этого заключается в том, что кеш заполнен точным запросом в качестве ключа для этого ответа.

Так что, если вы запрашиваете {queryX, limit:2}, он кэшируется как запрос, отличный от {queryX, limit:100}.

Вы действительно можете увидеть это в кэше, если используете Apollo Dev Tools:

enter image description here

...