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.

Las sesiones de Redis no persisten durante diferentes solicitudes en Express.

Tengo 2 rutas en el backend de mi aplicación.
La primera establece una sesión usando redis y utilizando una ruta diferente intento recuperar la sesión que se guardó anteriormente. Sin embargo, al intentar recuperar la sesión, obtengo una diferente a la que creé.

Así es como creo una sesión y le asigno una propiedad:

app.post("/login", (req, res) => {
  req.session.userId = 1
});

Y así es como intento recuperarla:

app.get("/cookie", (req, res) => {
  res.json(req.session);
});

Pero cuando se registra el req.session de la solicitud GET, obtengo uno sin la propiedad userID.
A pesar de ello, puedo ver la clave y el valor de la sesión utilizando el cliente de Redis con los comandos keys y mget.

Así es cómo se configura la cookie y la sesión:

app.use(
  session({
    name: "cookie",
    store: new RedisStore({ client: redisClient }),
    secret: "xxxxx",
    resave: false,
    saveUninitialized: false,
    cookie: {
      secure: false,
      httpOnly: false,
      maxAge: 1000 * 60 * 10,
    },
  })
);

Y este es el redisClient:

const redisClient = redis.createClient({
  host: "localhost",
  port: 6379,
});

¿Cómo puedo recuperar correctamente la sesión que configuré en la solicitud POST? ¿Estoy utilizando Redis de manera incorrecta o simplemente me estoy perdiendo algo?

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que podría haber un problema con la configuración del middleware de sesión. Cuando se utiliza Redis como almacén de sesiones, el middleware debe configurarse correctamente para usar Redis en lugar del almacén en memoria predeterminado. Según el código proporcionado, parece que esto se ha hecho correctamente.

    Sin embargo, podría haber un problema con la recuperación del objeto de sesión. Al llamar a res.json(req.session), el objeto req.session se convierte a JSON y se envía en la respuesta. Es posible que la propiedad userId se esté perdiendo durante esta conversión.

    Para recuperar correctamente la sesión que se estableció en la solicitud POST, se puede acceder directamente a la propiedad userId desde el objeto req.session en lugar de usar res.json():

    app.get("/cookie", (req, res) => {
      const userId = req.session.userId;
      res.send(`ID de usuario: ${userId}`);
    });
    

    Esto debería recuperar correctamente la propiedad userId del objeto de sesión.

    Si esto no funciona, es posible que pueda haber un problema con la conexión a Redis o con Redis en sí. En este caso, puede ser útil revisar los registros de Redis y ver si se informan algún error.

    En general, parece que el código está utilizando Redis correctamente y que el problema está en la recuperación del objeto de sesión. Al acceder directamente a la propiedad userId desde el objeto req.session, deberíamos poder recuperar la sesión que se estableció en la solicitud POST.

Comments are closed.