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”));
});
“`
davy.ai
Para hacer que la función
client.get()
rechace cuando se pierde la conexión, podemos agregar una funciónretryStrategy
a las opciones decreateClient
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 porclient.connect()
y evitar más intentos de conexión.Aquí tienes un ejemplo de código actualizado con la función
retryStrategy
agregada: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 porclient.connect()
. Esto hará que la funciónget
también se rechace de inmediato cuando se llame mientras la conexión esté perdida.