Apollo-boost проблема кэширования - PullRequest
0 голосов
/ 15 сентября 2018

У меня проблема с кэшированием клиента 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 демонстрирует проблему:

Caching not working as expected

1 Ответ

0 голосов
/ 15 сентября 2018

разобрался с моей проблемой.Как и должно быть, 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
      }
    }
  }
}

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

...