Apollo разрешает поля с помощью директивы @client
, сначала ища соответствующий распознаватель, а если он не существует, то ищет данные непосредственно в кеше.
Когда запросы хранятся в кэше, на них ссылаются не только поля, но и аргументы, передаваемые этим полям. Таким образом, результат запроса, такой как hubs(isOnline: true)
и hubs(isOnline: false)
, будет храниться отдельно в кеше. Точно так же hubs(isOnline: true)
и hubs
являются отдельными запросами и хранятся отдельно.
Итак, у вас есть некоторые данные в кэше, но они фактически не связаны с запросом hubs(isOnline: true)
, который вы пытаетесь выполнить.
Даже если в этом случае Apollo действительно извлек бы из того, что уже находится в кэше, в этом случае вам все равно все же понадобится пользовательский преобразователь, поскольку вы пытаетесь реализовать некоторую бизнес-логику (показывать только концентраторы)которые находятся в сети), и Apollo не может знать, как реализовать это, основываясь только на аргументе, который вы передаете.
В любом случае ответ заключается в предоставлении пользовательского преобразователя для поля hubs
,Что-то вроде:
const resolvers = {
Query: {
hubs: (obj, { isOnline }, { cache }) => {
const { hubs } = cache.readQuery({ query: hubsQuery })
return hubs.filter((hub) => hub.isOnline)
}
}
}