Redis
 sql >> Base de données >  >> NoSQL >> Redis

Redis (ioredis) - Impossible d'attraper l'erreur de connexion afin de les gérer avec élégance

Les erreurs de connexion sont signalées comme une error événement sur le client Redis objet.

Selon la section "Reconnexion automatique" de la documentation, ioredis essaiera automatiquement de se reconnecter lorsque la connexion à Redis est perdue (ou, vraisemblablement, incapable d'être établie en premier lieu). Seulement après maxRetriesPerRequest tentatives les commandes en attente "seront-elles vidées avec une erreur", c'est-à-dire accéderont au catch ici :

  try {
    cachedItem = await redisClient.get(queryString); // This emit an error on the redis client, because it fails to connect (that's intended, to test the behaviour)
  } catch (e) {
    logger.error(e); // It never goes there, as the error isn't "thrown", but rather "emitted" and handled by redis its own way
    epsagon.setError(e);
  }

Puisque vous arrêtez votre programme à la première erreur :

  client.on('error', function (e) {
    // ...
    if (e.message === 'ERR invalid password') {
      logger.error(`Fatal error occurred "${e.message}". Stopping server.`);
      throw e; // Fatal error, don't attempt to fix

... les tentatives et le "vidage avec une erreur" qui s'ensuit n'ont jamais la possibilité de s'exécuter.

Ignorer les erreurs dans client.on('error' , et vous devriez obtenir l'erreur renvoyée par await redisClient.get() .