如果没有req.session.save(),会话将不会保存在Node.js中

我正在使用Node.js,Express和Redis构build一个网站进行会话pipe理。 无论什么原因,如果我有一个会话variables(在这个例子中是isLoggedIn ),并刷新页面,variables不会被保存,但是,如果我设置variables后调用req.session.save() ,它会得到保存到Redis(redis-cli监视器显示 – 不调用save()表明该variables不存在,而调用save()显示它)。

我正在使用它来设置和启动服务器:

 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var swig = require('swig'); var session = require('express-session') var RedisStore = require('connect-redis')(session); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express(); // Configure the favicon first. This avoids other middleware from processing the request if we know the request is for the favicon. app.use(favicon(__dirname + '/public/images/favicon.ico')); // All other requests will require everything else. // Set up the view engine. app.set('view engine', 'html'); app.set('views', path.join(__dirname, '/views')); app.engine('html', swig.renderFile); // Set up our logger. app.use(logger('dev')); // Set up JSON parsing. app.use(bodyParser.json()); // Set up encoded URL parsing. app.use(bodyParser.urlencoded()); // Set up the cookie parser. app.use(cookieParser('thedogsleepsatnight')); // Set up our session store. This will use Redis as our session management. app.use(session({ resave: true, saveUninitialized: true, secret: "thedogsleepsatnight", store: new RedisStore() })); app.use(require('stylus').middleware(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); 

然后,在那条路上,我有:

 var express = require('express'); var router = express.Router(); router.get('/', function(req, res) { console.log(req.session.isLoggedIn); if (req.session.isLoggedIn) { console.log("Logged in!"); } else { console.log("Not logged in"); } res.render('index'); }); router.post('/login', function(req, res) { console.log("Going to set isLoggedIn. Currently: " + req.session.isLoggedIn); req.session.isLoggedIn = true; console.log("Set isLoggedIn. Currently: " + req.session.isLoggedIn); }); module.exports = router; 

从那里,我应该能够导航到/login ,使会话设置isLoggedIn为真,并应该自动保存到Redis。 之后,前往/应告诉我,我login。加载/login确实设置variables,第二个日志显示,但加载/说我没有login。redis-cli monitor显示

 1414076171.241836 "setex" "sess:FIDJ9qDbX_0u9pzlC6VZEW76zZcyiPME" "86400" "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}" 

保存时,不包括isLoggedInvariables,但在req.session.save()中添加显示:

 1414076475.601644 "setex" "sess:FIDJ9qDbX_0u9pzlC6VZEW76zZcyiPME" "86400" "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"isLoggedIn\":true}" 

任何想法,为什么我不得不调用req.session.save()当我看到所有的例子不使用它?

好的,我明白了。 我会把这个答案提供给其他任何碰巧遇到的人。

对于GET请求,服务器假定您将要发回数据,并在路由完全处理后自动保存会话数据。

对于POST请求(我正在使用的),然而,相同的假设没有做出。 会话状态仅保存在以下两种情况中的一种:当数据发送出去时(通过res.sendres.redirect等),或者手动调用req.session.save() 。 我已经调用/从AJAX请求login,我只是没有返回任何东西,如果某些条件得到满足。 在设置会话variables之后,让服务器用一些数据来响应客户端。