2 votes

Une session créée dans un itinéraire n'est pas disponible dans d'autres itinéraires.

J'essaie de mettre en place des sessions dans mon application node.js. Pour ce faire, j'utilise les modules "express", "express-session" et "express-mysql-session" pour les stocker dans une base de données sur mon serveur. Mon code fonctionne parfaitement tant que j'accède uniquement aux paramètres req.session à l'intérieur de la route où la session est créée. Dans les autres routes (ou même dans le fichier de démarrage), les paramètres créés génèrent une erreur indéfinie.

J'ai déjà essayé de créer le fichier app.use(session(...)) dans le fichier de démarrage. Si je fais cela, tout fonctionne bien et les paramètres qui sont créés dans une route sont également utilisables dans d'autres routes. Mais comme je veux garder le fichier de démarrage aussi petit que possible, ces lignes de code devraient être gérées dans une route.

Voici mon code : login.js (une route)

var express = require('express');
var router = express.Router();
var session = require('express-session');
var MySQLStore = require('express-mysql-session');

var dbOptions = {
    host: "ip",
    user: "user",
    password: "pw",
    database: "some db"
};

var sessionStore = MySQLStore(dbOptions);

router.use(session({
    key: 'some key',
    secret: 'some secret',
    store: sessionStore,
    resave: false,
    saveUninitialized: false
}));

router.post('/login', (req, res) =>{
    req.session.username = req.body.username;
    res.end("done");
});

router.get('/sessionTest', (req, res) => {
    if(req.session.username) {
        res.write(`<h1>Hello ${req.session.username} </h1><br>`);
        res.end('<a href='+'/timetracking/logout'+'>Logout</a>');
    }
    else {
        res.write('<h1>Please login first.</h1>');
        res.end('<a href='+'/timetracking/login'+'>Login</a>');
    }
});

router.get('/logout',(req,res) => {
    req.session.destroy((err) => {
        if(err) {
            return console.log(err);
        }
        res.redirect('/timetracking/login');
    });

});

module.exports = router;

timetracking.js (le fichier de démarrage)

var http = require('http');
const express = require('express');
const app = express();
var gets = require('./lib/gets');
var login = require('./lib/login');
const session = require('express-session');

//Make '/timetracking/' to the standard handler for get requests
app.use('/timetracking', [gets, login]);

app.get('/test', (req, res) =>{
    res.send(req.session.username);
});

app.listen(80);

Lorsque je charge localhost/test, je peux toujours voir le cookie dans les outils de développement web. Mais "req.session.username" est indéfini.

Merci pour votre aide !

1voto

jfriend00 Points 152127

req.session ne sera disponible que dans les itinéraires qui se produisent APRÈS l'exécution de l'intergiciel de session (en fonction de l'ordre). De plus, si l'intergiciel de session n'est présent que sur un seul routeur, alors ce routeur ne sera pas disponible. req.session ne sera disponible que dans les routes qui correspondent à ce routeur et seulement après que ce routeur s'exécute sur une requête donnée.

Donc, si vous voulez req.session L'intergiciel doit être défini à l'avance et de manière à ce qu'il fonctionne sur toutes les routes possibles (sur lesquelles vous voulez l'utiliser), et pas seulement dans certains routeurs qui ne fonctionnent que sur certains chemins.

Rappelez-vous, c'est votre intergiciel de session qui définit req.session sur n'importe quelle demande entrante. Il doit s'exécuter sur une requête donnée avant que vous ne vouliez accéder à req.session .

Il n'est pas nécessaire de placer votre intergiciel de session directement dans votre fichier de démarrage. Vous pouvez toujours le placer dans son propre module, il suffit de charger ce module à partir du fichier de démarrage et de lui passer le paramètre app afin qu'il puisse initialiser l'intergiciel global avant toutes vos routes.

Voici un exemple de fichier de démarrage :

const express = require('express');
const app = express();

// initialize global middleware
require('./myMiddleware')(app);

// set up other routers and routes here
// and start the server

Et, un fichier myMiddlware.js :

// load and initialize session stuff
const session = ....;

module.exports = function(app) {
    // install session middleware
    app.use(session(...))
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X