3 votes

Travailleurs de service : Invalider des réponses mises en cache spécifiques

Je veux invalider un GET précédemment mis en cache par mon worker service lorsqu'un POST, PUT ou DELETE sur la même URL ou toute URL d'une ressource ou collection 'en dessous' se produit, par exemple :

Disons que je mets en cache /abonnements et plus tard je fais un POST sur /abonnements pour ajouter un nouvel abonnement, ou disons que je PUT sur /abonnements/243 pour mettre à jour un abonnement existant. Cela signifie que ma collection d'abonnements mise en cache est maintenant obsolète et je veux la supprimer de ma cache pour que la prochaine requête aille vers le serveur.

J'ai pensé à deux options, mais je ne suis pas sûr de la faisabilité de l'une ou l'autre :

Puis-je utiliser une expression régulière dans l'appel à caches.match() ?

De cette manière, je pourrais simplement faire correspondre la partie de la collection parent de l'URL demandée avec les clés trouvées dans la cache.

Puis-je obtenir les clés de chaque réponse de données mise en cache ?

Si c'est le cas, je pourrais simplement parcourir chaque réponse et voir si la clé répond à mes critères pour la supprimer.

Des idées ? Merci !

3voto

Jeff Posnick Points 6850

Vous ne pouvez pas utiliser une RegExp ou autre chose que la correspondance de chaînes (facultativement en ignorant les paramètres de requête) lors d'une recherche via caches.match().

Je recommande la deuxième approche, dans laquelle vous ouvrez un cache nommé, obtenez ses clés, puis filtrez celles qui vous intéressent. Ce n'est pas beaucoup de code, et cela semble assez propre avec await/async:

async function deleteCacheEntriesMatching(cacheName, regexp) {
  const cache = await caches.open(cacheName);
  const cachedRequests = await cache.keys();
  // request.url est une URL complète, pas seulement un chemin, veuillez utiliser une RegExp appropriée!
  const requestsToDelete = cachedRequests.filter(request => request.url.match(regexp));
  return Promise.all(requestsToDelete.map(request => cache.delete(request)));
}

// Appelez-le comme ceci :
await deleteCacheEntriesMatching('my-cache', new RegExp('/subscriptions'));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X