无法访问Express / NodeJS中的req.sessionvariables

我已经看到了这个问题的许多变化,但似乎没有解决我的问题。 我正在尝试使用Express来设置Node.js服务器。 这是我的服务器configuration:

 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); 

这里有一些简单的路线:

 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); } 

所以在我的login路线中,我可以按预期打印会话variables。 但是如果访问login路由后访问auth路由,会话variables是未定义的。 我怎样才能使Express会议工作?

在典型的Web应用程序中,用于authentication用户的凭证只会在login请求期间传输。 如果validation成功,会话将通过在用户浏览器中设置的cookie来build立和维护。

每个后续请求将不包含凭据或所有用户数据,而是用于标识会话的唯一Cookie。 为了支持login会话,您必须在每个请求中序列化和反序列化进出会话的用户实例。

在你的情况下,你已经分配了req.session.user = user; 只在/login请求。 它将不可用于进一步的请求( /auth )。

您必须通过会话ID在/auth请求中获取用户信息。 (或)更好的是你可以使用护照进行身份validation。

我想也许你的redis客户端连接不好,尝试这样的事情,一定要启动redis服务

 sudo service redis-server start 

或者你调用RedisStorevariables的方式来看看这个例子

例:

 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')); 

目前接受的答案没有意识到express.session已经处理了与req.session对象的基于cookie的会话。 我试过一个修剪你的版本不使用redis,它的工作。 查看connect-redis文档,看起来您需要将会话传递给connect-redis。 你目前正在通过它expression。 我相信改变会解决你的问题。

PS我会更新您的节点/快递版本,因为当前版本的Express不再具有内置的中间件以及其他改进。

新版本的快递:

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

而不是:

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