Impossible d'accéder aux variables de requête dans Express / NodeJS

J'ai vu de nombreuses variantes de cette question, mais aucune ne semblait résoudre mon problème. J'essaie de configurer un serveur Node.js en utilisant Express . Voici ma configuration de serveur:

 var express = require('express'), RedisStore = require('connect-redis')(express); var app = express(); app.use(express.urlencoded()); app.use(express.json()); app.use(express.cookieParser()); app.use(express.session({ store: new RedisStore(), secret: APP_SECRET })); // Initialize redis connection var client = redis.createClient(); client.on('connect', function() { console.log('Connected to Redis server') }) client.on('error', function (err) { console.log('Error ' + err); }); // Enable cross-origin resource sharing app.all('*', function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'X-Requested-With'); next(); }); var api = require('./controllers/api.js'); app.post('/login', api.login); app.get('/auth', api.auth); app.listen(3000); 

Voici quelques itinéraires simples:

 exports.login = function(req, res) { var user = new User(req.username, req.password); req.session.user = user; console.log(req.session.user); //works res.json({user:user}); } exports.auth = function(req, res) { console.log(req.session.user); //doesn't work res.json(req.session.user); } 

Donc, dans ma route de login , je peux imprimer la variable de session comme prévu. Mais si je visite l' auth route après avoir visité la route de login , la variable de session est indéfinie. Comment puis-je utiliser les sessions Express?

Dans une application Web typique, les informations d'identification utilisées pour authentifier un utilisateur ne seront transmises que pendant la demande de connexion. Si l'authentification réussit, une session sera établie et maintenue via un jeu de cookies dans le navigateur de l'utilisateur.

Chaque demande ultérieure ne contiendra pas d'informations d'identification ni toutes les données utilisateur, mais plutôt le cookie unique qui identifie la session. Afin de prendre en charge les sessions de connexion, vous devez sérialiser et désérialiser les instances d'utilisateur vers et depuis la session dans chaque requête.

Dans votre cas, vous avez assigné req.session.user = user; Uniquement dans la demande de /login . Il ne sera pas disponible pour d'autres demandes ( /auth ).

Vous devez également obtenir des informations d'utilisateur dans la demande /auth par identifiant de session. (Or) Mieux vaut utiliser le passeport pour l'authentification.

La réponse actuellement acceptée ne s'est pas rendue compte que express.session gère déjà les sessions basées sur les cookies avec l'objet req.session. J'ai essayé une version taillée de votre système sans utiliser de redis et cela a fonctionné. En regardant les documents connect-redis, il semble que vous devez passer une session pour se connecter-redis. Vous le passez expressément. Je crois que cela changera votre problème.

PS Je mettrais à jour vos versions nœud / express, car les versions actuelles d'express ne disposent plus de middleware intégré avec d'autres améliorations.

Nouvelles versions de express:

 var session = require('express-session'); var cookieParser = require('cookie-parser'); var json = require('express-json'); var bodyParser = require('body-parser') 

Plutôt que:

 express.session express.cookieParser express.json express.bodyParser 

Je pense que peut-être que votre client redis ne se connecte pas bien, essayez quelque chose comme ça et assurez-vous de démarrer le service redis

 sudo service redis-server start 

Ou la façon dont vous appelez la variable RedisStore, regardez l'exemple

Exemple:

 var express = require('express'); var app = express(); var cookieParser = require('cookie-parser'); var session = require('express-session'); var RedisStore = require('connect-redis')(session); app.set('port',process.env.PORT || 3000); app.use(cookieParser()); app.use(session({ resave: true, saveUninitialized: true, store: new RedisStore({ host: 'localhost', port: 6379 }), secret: 'some string/hash secret' })); var counter=0; app.get('/', function(request, response){ //adding some value to request.session counter = counter+1; request.session.color = {'anyValue': counter}; // console.log('Session ID: ', request.sessionID); console.log('Session: ', request.session); response.send('some text counter: '+request.session.color['anyValue']); }); app.listen(app.get('port'));