gpt4 book ai didi

javascript - 没有 req.session.save() session 不会保存在 Node.js 中

转载 作者:IT老高 更新时间:2023-10-28 22:02:35 27 4
gpt4 key购买 nike

我正在构建一个使用 Node.js、Express 和 Redis 进行 session 管理的网站。无论出于何种原因,如果我有一个 session 变量(本例中为 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,将 session 设置为 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 请求,服务器假定您要发回数据,并在路由完全处理后自动保存 session 数据。

但是,对于 POST 请求(我正在使用的),没有做出相同的假设。 session 状态仅在以下两种情况之一中保存 - 发送数据时(通过 res.sendres.redirect 等),或者您手动调用 req.session.save()。我已经从 AJAX 请求中调用/login,如果满足某些条件,我只是没有返回任何内容。在设置 session 变量修复此问题后,让服务器向客户端响应一些数据。

关于javascript - 没有 req.session.save() session 不会保存在 Node.js 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26531143/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com