Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis (ioredis) – Verbindungsfehler können nicht abgefangen werden, um sie ordnungsgemäß zu behandeln

Verbindungsfehler werden als error gemeldet Ereignis auf dem Client Redis Objekt.

Gemäß dem Abschnitt „Auto-Reconnect“ der Dokumentation versucht Ioredis automatisch, die Verbindung wiederherzustellen, wenn die Verbindung zu Redis unterbrochen wird (oder vermutlich überhaupt nicht hergestellt werden kann). Erst nach maxRetriesPerRequest Versuche werden die anstehenden Befehle "mit einem Fehler gespült", d.h. zum catch gelangen hier:

  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);
  }

Da Sie Ihr Programm beim ersten Fehler stoppen:

  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

... die Wiederholungsversuche und das anschließende "Flushing with a error" niemals ausgeführt werden können.

Ignorieren Sie die Fehler in client.on('error' , und Sie sollten den Fehler erhalten, der von await redisClient.get() zurückgegeben wird .