Partage
  • Partager sur Facebook
  • Partager sur Twitter

express-session : afficher sessions

    21 juin 2021 à 18:48:25

    Bien le bonjour.

    Après avoir sué sang et eau sur la manière de d'accéder à toutes les sessions ouvertes sur mon site ( node/express/mongo ), je bute sur un autre problème, à savoir la gestion de la temporalité des processus ( synchrone? Asynchrone? Promise? ).

    En fait, j'arrive bien à accéder au session store, à récupérer les sessions ouvertes ou plutôt à la propriété "user" de celles-ci, et à les afficher dans la console.

    Problème, il semble que la page soit générée par res.render() avant que ce processus soit terminé. Donc impossible pour le moment d'afficher les noms d'utilisateurs récupérés sur ma page.

    Voici le code source de mon routeur "index" ( celui qui génère la page d'accueil du site ) :

    var express = require('express');
    var router = express.Router();
    var util = require('util');
    const MongoClient = require('mongodb').MongoClient;
    const assert = require('assert');
    const dbclient = new MongoClient('mongodb://localhost:27017', { useUnifiedTopology: true });
    
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
        var renderObject = { title: 'mySite'};
        
        if(req.session.user)
        {
            console.log('session trouvée : ' + req.session.user);
            renderObject.user = req.session.user;
            
            //TODO : récupérer la liste des utilisateurs connectés
            var foundSessions = [];
            
            dbclient.connect(function(err) {
                assert.equal(null, err);
                console.log("Connected successfully to server");
                const db = dbclient.db('mydb');
                const collection = db.collection('sessions');
                // Find some documents
                collection.find({}).toArray(function(err, docs) {
                assert.equal(err, null);
                for(i=0; i<docs.length; i++)
                {
                    foundSessions.push(JSON.parse(docs[i].session).user);
                }
                console.log('l33: ' + foundSessions);
                renderObject.sessions = foundSessions;
                });
                
            });
            
        }
        else
        {
            console.log('session non trouvée');
        }
        console.log('l44, sessions: ' + renderObject.sessions);
        res.render('index', renderObject);
    });
    
    module.exports = router;

    Et voici le résultat sur la console :

    session trouvée : lulu
    l44, sessions: undefined
    GET / 304 18.171 ms - -
    Connected successfully to server
    l33: boubou,lulu
    GET /stylesheets/style.css 304 0.510 ms - -



    une idée pour "faire propre", ou dois-je dispatcher mon instructions res.render() dans les deux conditions ( if(req.session.user) et else ) ?


    D'avance merci.




    -
    Edité par LucasWerquin 22 juin 2021 à 10:49:05

    • Partager sur Facebook
    • Partager sur Twitter
      22 juin 2021 à 17:57:51

      Bonjour effectivement la solution la plus simple et la plus directe et de répété l'appel à res.render dans les deux condition pour pouvoir l'exécuté après les traitements asynchrone dans le if, le problème actuellement et que dans le if l'appel res.render ce fait avant que les traitements en base de donnée soit terminé et que tu n'envoie pas les bon paramètre à la vue.

      var express = require('express');
      var router = express.Router();
      var util = require('util');
      const MongoClient = require('mongodb').MongoClient;
      const assert = require('assert');
      const dbclient = new MongoClient('mongodb://localhost:27017', { useUnifiedTopology: true });
       
       
      /* GET home page. */
      router.get('/', function(req, res, next) {
          var renderObject = { title: 'mySite'};
           
          if(req.session.user)
          {
              console.log('session trouvée : ' + req.session.user);
              renderObject.user = req.session.user;
               
              //TODO : récupérer la liste des utilisateurs connectés
              var foundSessions = [];
               
              dbclient.connect(function(err) {
                  assert.equal(null, err);
                  console.log("Connected successfully to server");
                  const db = dbclient.db('mydb');
                  const collection = db.collection('sessions');
                  
                  // Find some documents
                  collection.find({}).toArray(function(err, docs) {
                      assert.equal(err, null);
                      for(i=0; i<docs.length; i++)
                      {
                          foundSessions.push(JSON.parse(docs[i].session).user);
                      }
                      console.log('l33: ' + foundSessions);
                      renderObject.sessions = foundSessions;
          			console.log('l44, sessions: ' + renderObject.sessions);
      			    res.render('index', renderObject);
                  });
                   
              });
               
          }
          else
          {
              console.log('session non trouvée');
          	console.log('l44, sessions: ' + renderObject.sessions);
      		res.render('index', renderObject);
          }
      });
       
      module.exports = router;
      

      -
      Edité par SamuelGaborieau3 22 juin 2021 à 18:00:13

      • Partager sur Facebook
      • Partager sur Twitter

      suggestion de présentation.

        22 juin 2021 à 18:23:14

        Merci à toi.
        C'est la solution que j'ai mise en place ^^

        Bon, ben si tu me dis que c'est le plus simple et le plus direct, et étant donné que ce n'est pas si choquant que ça, je considère le problème comme résolu.

        • Partager sur Facebook
        • Partager sur Twitter

        express-session : afficher sessions

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown