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 ) ?
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
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.
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.
suggestion de présentation.