Как сделать недействительным кеш в Apollo Server RESTDataSource - PullRequest
0 голосов
/ 07 апреля 2020

Используя простой пример "Movies API" из документации . Я добавил ttl в функцию getMovie, чтобы результат кэшировался в течение 10 минут. Как я могу сделать недействительным кеш в функции updateMovie?

const { RESTDataSource } = require('apollo-datasource-rest');

class MoviesAPI extends RESTDataSource {
  async getMovie(id) {
    return this.get(`movies/${id}`, {}, { cacheOptions: { ttl: 600 } });
  }

  async updateMovie(id, data) {
    const movie = await this.put(`movies/${id}`, data);

    // invalidate cache here?!

    return movie;
  }
}

Я знаю, что интерфейс KeyValueCache, который передается в ApolloServer, предоставляет функцию delete. Тем не менее, этот объект, похоже, не выставляется в источниках данных. Он обернут внутри HTTPCache, который предоставляет только функцию fetch. KeyValueCache также заключен в PrefixingKeyValueCache, поэтому кажется, что невозможно что-то внедрить в кеш, без каких-либо неприятных хаков, предполагая внутреннюю реализацию RESTDataSource.

1 Ответ

0 голосов
/ 09 апреля 2020

Похоже, лучшее решение, которое я могу найти, это просто оставить слой кэша HTTP в покое и использовать отдельный слой кэша:

const { RESTDataSource } = require('apollo-datasource-rest');
import { PrefixingKeyValueCache } from 'apollo-server-caching';

class MoviesAPI extends RESTDataSource {
  initialize(config) {
    super.initialize(config);
    this.movieCache = new PrefixingKeyValueCache(config.cache, 'movies:');
  }

  async getMovie(id) {
    const cached = await this.movieCache.get(id);
    if (cached) return cached;

    const movie = await this.get(`movies/${id}`);
    await this.movieCache.set(id, movie);
    return movie;
  }

  async updateMovie(id, data) {
    const movie = await this.put(`movies/${id}`, data);

    await this.movieCache.delete(id);

    return movie;
  }
}

Он по-прежнему использует кэш приложения, но с другим префикс, чем кеш HTTP.

...