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.

Express-Session funciona bien en el cliente REST (extensión de VS Studio) pero no en el sitio React.

Básicamente, si declaro una variable de sesión en una ruta, no puedo acceder a ella (está indefinida) en otra.

Este es mi middleware:

app.use(cors({
 origin: ["http://localhost:3000"], methods: ["GET", "POST"] })); 
app.use(session({ 
 secret: process.env.SESSION_SECRET, 
 resave: false, saveUninitialized: false 
 }));

Y este es mi ruta /log-in:

router.post('/api/users/auth/log-in/', async (req, res) => {
 // ... lógica de autenticación de usuario, aquí se define el booleano 'authenticated'
 req.session.authenticated = authenticated; 
 req.session.save(); 
 if (authenticated) req.session.user = req.body.username; 
 res.json({"success": true, "authenticated": authenticated}); 
});

Si registro la variable de sesión dentro de esta ruta, funciona perfectamente.

Pero luego, en otra ruta, al acceder con req.session.authenticated, la variable devuelve un undefined.

Estoy seguro de que me falta algo, pero no puedo hacer que funcione. Cualquier ayuda es apreciada!

Para aclarar, si hago todo esto (iniciar sesión y verificar si estoy autenticado) desde el cliente REST, funciona bien.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en cómo estás tratando de acceder a la variable de sesión en la otra ruta.

    Para poder acceder a las variables de sesión entre rutas, debes asegurarte de que las rutas estén dentro del mismo objeto router.

    Por ejemplo, si tienes dos rutas /inicio-de-sesion y /panel-de-control, y ambas necesitan acceder a la variable de sesión autenticado, debes definir ambas rutas dentro del mismo objeto router:

    const router = express.Router();
    
    router.post('/inicio-de-sesion', async (req, res) => {
      // ... lógica de autenticación del usuario, aquí se define el booleano 'autenticado'
      req.session.autenticado = autenticado;
      req.session.save();
      if (autenticado) req.session.usuario = req.body.username;
      res.json({"exito": true, "autenticado": autenticado});
    });
    
    router.get('/panel-de-control', (req, res) => {
      // accede a la variable de sesión autenticado aquí
      if (req.session.autenticado) {
        // renderiza la página de panel de control
        res.render('panel-de-control');
      } else {
        // redirige a la página de inicio de sesión
        res.redirect('/inicio-de-sesion');
      }
    });
    
    // exporta el objeto router para que pueda ser utilizado en app.js
    module.exports = router;
    

    Luego, en tu archivo principal app.js, puedes utilizar el objeto router de la siguiente forma:

    const router = require('./routes');
    app.use('/', router);
    

    Esto montará el objeto router en la ruta raíz, por lo que las rutas /inicio-de-sesion y /panel-de-control serán accesibles en /inicio-de-sesion y /panel-de-control, respectivamente.

    Al asegurarte de que ambas rutas estén dentro del mismo objeto router, deberías ser capaz de acceder a las variables de sesión entre rutas.

    ¡Espero que esto ayude! Hazme saber si tienes alguna pregunta adicional.

Comments are closed.