我正在使用Node.js,Express和Redis构建一个用于会话管理的网站.无论出于何种原因,如果我有一个会话变量(本例中为isLoggedIn),并刷新页面,则变量不会被保存,但是,如果我在设置变量后调用req.session.save(),它会保存到Redis(redis-cli监视器显示这一点 – 不调用save()显示变量不存在,而调用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设置为true,并且应该自动保存到Redis.在那之后,前往/应该告诉我我已经登录.加载/登录确实设置变量,第二个日志显示,但加载/说我没有登录.redis-cli监视器显示
1414076171.241836 "setex" "sess:FIDJ9qDbX_0u9pzlC6VZEW76zZcyiPME" "86400" "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}"
保存时,不包括isLoggedIn变量,但在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.send,res.redirect等),或者手动调用req.session.save().我已经从AJAX请求调用/登录了,如果满足某些条件,我就不会返回任何内容.让服务器在设置会话变量后用一些数据响应客户端修复此问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。