web-dev-qa-db-fra.com

Comment contrôler le cache dans Nestjs?

Je lis récemment le doc de Nestjs et j'ai appris quelque chose.

Mais j'ai trouvé quelque chose qui m'a perplexe.

Dans Techniques/Caching , le doc me montre d'utiliser un décorateur comme @UseInterceptors(CacheInterceptor) sur un contrôleur pour mettre en cache sa réponse (piste par défaut par route).

J'ai écrit une témoignage et j'ai trouvé que c'est utile. Mais je n'ai trouvé aucune explication pour montrer comment nettoyer le cache. Cela signifie que je dois attendre que le cache expire.

À mon avis, un magasin de cache doit fournir une API pour effacer le cache par clé, de sorte qu'il peut mettre à jour le cache lorsque les données changent (en appelant explicitement une API claire).

Y'a-t'il un quelconque moyen d'y arriver?

5
pingze

Vous pouvez injecter la instance sous-jacente cache-manager Avec @Inject(CACHE_MANAGER). Sur l'instance cache-manager Vous pouvez ensuite appeler la méthode del(key, cb) _ Pour effacer le cache d'une clé spécifiée, voir le Docs .

Exemple

counter = 0;
constructor(@Inject(CACHE_MANAGER) private cacheManager) {}

// The first call increments to one, the preceding calls will be answered by the cache
// without incrementing the counter. Only after you clear the cache by calling /reset
// the counter will be incremented once again.
@Get()
@UseInterceptors(CacheInterceptor)
incrementCounter() {
  this.counter++;
  return this.counter;
}

// Call this endpoint to reset the cache for the route '/'
@Get('reset')
resetCache() {
  const routeToClear = '/';
  this.cacheManager.del(routeToClear, () => console.log('clear done'));
}

Edit nest-clear-cache

3
Kim Kern

Vous pouvez également utiliser une autre approche, vous pourriez utiliser tils-décorateurs lib (npm install --save utils-decorators) et profitez du décorateur d'asyncmémoize. Ensuite, il vous suffit d'ajouter un décorateur à votre fonction de contrôleur:

import {memoizeAsync} from 'utils-decorators';

const cache = new Map();

class Controller {


 @Get()
 @memoizeAsync({cache: cache})
 incrementCounter() {
  this.counter++;

  return this.counter;
 }

 @Get('reset')
 resetCache() {
   // do whatever you want with the cache map.
 }
}
1
vlio20