es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Node.js redis se queda colgado si la conexión falla (no se resuelve ni se rechaza).

Si la conexión se interrumpe, Redis se bloquea.

const redis = require("redis")
// redis no está disponible en localhost
const client = redis.createClient({
  socket: { connectTimeout: 1000, reconnectStrategy: (r) => r > 5 ? new Error("mensaje") : 500 }
});
let count = 0;
client.on("error", () => console.log(++count))

<p>client.connect().catch(() => console.log("falló la conexión"));
// ni imprime sí ni no
client.get("key").then(() => console.log("sí")).catch(() => console.log("no"))
```</p>

Deseo que el método `client.get()` anterior sea rechazado.

Edición 1: (el anterior es rechazado, aún hay un problema con el siguiente escenario)

// redis está disponible en localhost
const redis = require(“redis”);

const client = redis.createClient({
socket: { connectTimeout: 1000, reconnectStrategy: (r) => (r > 5 ? new Error(“mensaje”) : 500) }
});

let count = 0;
client.on(“error”, () => console.log(++count));

client
.connect()
.then(() => console.log(“conexión exitosa”))
.catch(() => console.log(“falló la conexión”))
.then(() => {
// ni imprime sí ni no
// Coloque un depurador en la siguiente línea, una vez que tenga éxito la conexión y llegue al punto de interrupción, cierre el servidor de Redis y luego continúe.
client
.get(“key”)
.then(() => console.log(“sí”))
.catch(() => console.log(“no”));
});
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que la función client.get() rechace cuando se pierde la conexión, podemos agregar una función retryStrategy a las opciones de createClient que se llamará cada vez que falle un intento de conexión. La función puede devolver un error para rechazar inmediatamente la promesa devuelta por client.connect() y evitar más intentos de conexión.

    Aquí tienes un ejemplo de código actualizado con la función retryStrategy agregada:

    const redis = require("redis");
    const client = redis.createClient({
      socket: {
        connectTimeout: 1000,
        reconnectStrategy: (r) => r > 5 ? new Error("mensaje") : 500,
      },
      retryStrategy: (options) => {
        console.log("Conexión perdida con Redis, intentando reconectar...");
        return new Error("Conexión perdida");
      },
    });
    
    let count = 0;
    client.on("error", () => console.log(++count));
    
    client.connect()
      .then(() => console.log("conexión exitosa"))
      .catch(() => console.log("conexión fallida"));
    
    client.get("clave")
      .then(() => console.log("sí"))
      .catch(() => console.log("no"));
    

    En el código actualizado, la función retryStrategy registra un mensaje en la consola cuando se pierde la conexión y devuelve un error para rechazar inmediatamente la promesa devuelta por client.connect(). Esto hará que la función get también se rechace de inmediato cuando se llame mientras la conexión esté perdida.

Comments are closed.