sql >> Base de Datos >  >> NoSQL >> Redis

Redis (ioredis):no se puede detectar el error de conexión para manejarlo correctamente

Los errores de conexión se informan como un error evento en el cliente Redis objeto.

De acuerdo con la sección "Reconexión automática" de los documentos, ioredis intentará volver a conectarse automáticamente cuando se pierda la conexión a Redis (o, presumiblemente, no se pueda establecer en primer lugar). Solo después de maxRetriesPerRequest intentos, los comandos pendientes "se eliminarán con un error", es decir, llegarán a catch aquí:

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

Dado que detiene su programa en el primer error:

  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

...los reintentos y el subsiguiente "lavado con un error" nunca tienen la oportunidad de ejecutarse.

Ignora los errores en client.on('error' , y debería obtener el error devuelto por await redisClient.get() .