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

【字号: 日期:2024-04-15浏览:29作者:雯心
(adsbygoogle = window.adsbygoogle || []).push({}); 如何解决如果没有req.session.save(),会话将不会保存在Node.js中?

好的,我已经解决了。对于任何碰巧遇到的其他问题,我都会在这里给出答案。

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

但是,对于POST请求(我正在使用的内容),没有做出相同的假设。会话状态仅保存在两个条件之一-要么当被发送出去的数据(通过res.send,res.redirect等等),或者如果你手动调用req.session.save()。我已经从AJAX请求中调用/login,如果满足某些条件,我什么都不会返回。设置会话变量后,让服务器用一些数据响应客户端。

解决方法

我正在使用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’,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。之后,转到/应当告诉我我已经登录。加载/login确实设置了变量,第二个日志显示了该信息,但是加载/表明我没有登录。redis-cli monitor显示

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,'path':'/'},'isLoggedIn':true}'

关于我看到的req.session.save()所有示例均未使用时为什么要致电的任何想法?

相关文章: