Apollo-boost проблема кэширования
У меня проблема с кэшированием клиента apollo, и я не уверен, что понимаю почему. Я создаю угловое 6 приложение, используя apollo-boost, все работает хорошо. Теперь у меня есть сценарий, в котором мой запрос graphql принимает идентификатор (пользователя) и строку фильтра (используется для фильтрации записей в серверной части). Код углового компонента выглядит так:
ngOnInit() {
this.filter$.subscribe(filterValue => {
this.route.params.subscribe(this.getAppointments.bind(this, filterValue));
});
}
getAppointments
функция выглядит так:
getAppointments(filter: string, params: {id: string}) {
this.artistAppointmentBookGQL.watch({artistId: user.artist._id, filter}).valueChanges
.pipe(
map(results => {
// THIS ALWAYS RUNS WHEN THE FILTER CHANGES
// HOWEVER THE RESULTS ARE ALWAYS THE LAST QUERY RUN
// IF THE FILTER HAS BEEN RUN BEFORE
console.log(user.artist._id, filter, results.data.artist.appointmentBook);
return results.data.artist.appointmentBook;
}));
}
Запрос graphql:
query artistAppointmentBook($artistId: ID!, $filter: String) {
artist(id: $artistId, appointmentType: $filter) {
_id
appointmentBook {
_id
created_at
firstName
lastName
date
price
stripe {
charge {
id
amount
}
}
}
}
Основная проблема:
У меня есть 4 различных возможных значения фильтра (все, неподтвержденные, подтвержденные, оплаченные). Когда я выполняю эти запросы с каждым значением фильтра, он работает как положено, и я получаю правильные наборы результатов с сервера apollo. Однако, как только я выполняю один и тот же запрос дважды, я получаю только результат того, каким был последний запрос, и сетевой вызов не выполняется, предположительно, потому что он использует кэшированную версию.
Разве кэш не должен основываться на переменных вводах? Кажется, он работает нормально при первом запуске с разными переменными, но как только один из них дублируется, я получаю только то, что дал последний вызов. Спасибо за любую помощь!
Этот GIF демонстрирует проблему:
1 ответ
Разобрался с моей проблемой. Как и должно быть, apollo кэширует запись исполнителя, потому что она имеет _id и тип. Фильтр передавался в запрос артиста, когда он должен был быть передан в appointmentBook
уровень. Я обновил свою схему, чтобы принять параметр фильтра, а затем передал его туда, а не в запрос исполнителя.
Изначально у меня было:
query artistAppointmentBook($artistId: ID!, $filter: String) {
artist(id: $artistId, appointmentType: $filter) {
_id
appointmentBook {
_id
created_at
firstName
lastName
date
price
stripe {
charge {
id
amount
}
}
}
}
Который нужно было изменить на:
query artistAppointmentBook($artistId: ID!, $filter: String) {
artist(id: $artistId) {
_id
appointmentBook(filter: $filter) {
_id
created_at
firstName
lastName
date
price
stripe {
charge {
id
amount
}
}
}
}
После этого обновления запросы кешируются должным образом.