我正在使用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。之后,转到/
应当告诉我我已经登录。加载/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,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"isLoggedIn\":true}"
关于我看到的req.session.save()
所有示例均未使用时为什么要致电的任何想法?
好的,我已经解决了。对于任何碰巧遇到的其他问题,我都会在这里给出答案。
对于GET请求,服务器假定您将向回发送数据,并且在路由完全处理后将自动保存会话数据。
但是,对于POST请求(我正在使用的内容),没有做出相同的假设。会话状态仅保存在两个条件之一-
要么当被发送出去的数据(通过res.send
,res.redirect
等等),或者如果你手动调用req.session.save()
。我已经从AJAX请求中调用/
login,如果满足某些条件,我什么都不会返回。设置会话变量后,让服务器用一些数据响应客户端。
问题内容: 我(几乎)成功地将Node.js与Express和Redis结合使用来处理会话。 我遇到的问题是使用时不保留会话。 这是我的看到方式: console.log()打印: 现在,这是以下代码: 这个console.log()打印出: 显然,“用户名”对象已消失。该会话没有保留它,而是重新构建了一个新会话。 我该如何解决?如果您需要任何信息,请不要犹豫。 这是我设置会话管理的代码: 这是基
1.有没有AI行业的从业人员给咱们破解一下它的神秘性,告诉我这个AI开发也是周而复始的套路的东西。 2.我上班2年,目前勉强可以做全站,我在想有没有必要转到AI那边去,其实也可以问做是未来AI能不能70%的替代全站程序员工作。 3.AI发展多久能够大规模的民用? 4.全站开发有哪些部分的任务是AI永远都无法取代的?? 另,我还有一个问题没有人回答: https://segmentfault.com
我试图将在一个视图中获得的查询结果保存到会话中,并在另一个视图中检索它,所以我尝试了如下方式: 然而,这给了我 我想知道这到底是什么意思,我应该怎么做?或者除了使用会话之外,还有其他方法可以做我想做的事情?
问题内容: 在Node.js中管理会话变量的最佳方法是什么?有图书馆吗? 问题答案: 您可以使用以下命令轻松完成此操作: 连接: http : //senchalabs.github.com/connect/ Connects就像Ruby中的Rack。它为您提供了一个额外的层,您可以在其中“玩”身份验证,会话,Cookie等。 另一种选择是使用框架: Express.js: http://expr
问题内容: 我当前正在使用一个Web应用程序,每次都调用此Web应用程序,请删除所有当前的Express会话,因此我需要一种方法来保留所有这些会话。我试图用connect- mongodb和connect- redis保留所有这些会话,但是都无效,nodemon总是说req.session是未定义的。我不知道该怎么做才能保留所有会话。 我需要一种方法来保留所有会话,执行时不要丢失它们,并为其提供教
MyDao类有通过Hibernate SessionFactory完成整个持久性任务的方法,它工作得很好。 如上所示,我在MyService中注入了MyDao,但是在注入MyDao后调用@PostConstruct init()方法(调试时,我可以看到MyDao被很好地注入)时,会出现下一个Hibernate异常: org.hibernate.Hibernate异常:没有找到当前线程的会话 我的服