Nodejs express4-session无法保存值问题

Nodejs express4-session无法保存值问题

https://github.com/expressjs/session 参照例子,welcome to the session demo. refresh! 刷新页面每次都显示这个。 将:res.end(‘welcome to the session demo. refresh!’); 修改为:res.end(‘welcome to the session demo. refresh!’+sess.views); 每次都显示 welcome to the session demo. refresh! 1

是被覆盖了吗?调用 sess.save() 方法也一样。

引用顺序

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var bodyParser = require('body-parser'); 

var app = express();

// view engine setup app.set(‘views’, path.join(__dirname, ‘views’)); app.set(‘view engine’, ‘ejs’);

app.use(favicon()); app.use(logger(‘dev’)); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); app.use(express.static(path.join(__dirname, ‘public’))); app.use(cookieParser()); app.use(session({ secret: ‘keyboard cat’, key: ‘sid’, cookie: { secure: true } }))

var routes = require(’./routes/index’); var users = require(’./routes/users’);

app.use(’/’, routes); app.use(’/users’, users);

app.listen(1111); module.exports = app;


5 回复

Nodejs express4-session无法保存值问题

背景描述

在使用 express-session 进行会话管理时,发现每次刷新页面时,会话中的值都会重新初始化,而不是保留之前的值。例如,在尝试保存一个计数器(sess.views)时,每次刷新页面都显示 1

示例代码

以下是代码片段,展示了如何设置和使用 express-session

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var bodyParser = require('body-parser');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(session({ 
    secret: 'keyboard cat', 
    key: 'sid', 
    cookie: { secure: true }
}));

var routes = require('./routes/index');
var users = require('./routes/users');

app.use('/', routes);
app.use('/users', users);

app.get('/', function(req, res) {
    var sess = req.session;

    if (sess.views) {
        sess.views++;
        res.end('welcome to the session demo. refresh! You have viewed this page ' + sess.views + ' times.');
    } else {
        sess.views = 1;
        res.end('welcome to the session demo. refresh! This is your first time here.');
    }
});

app.listen(1111);
module.exports = app;

问题分析

在上述代码中,我们试图通过 req.session 来管理会话数据。如果会话中存在 views 属性,则将其递增并返回;否则,初始化为 1

解决方案

确保在配置 express-session 中没有设置 cookie.secure: true,除非你是在 HTTPS 上运行应用。因为 secure: true 会使得会话 cookie 只能在 HTTPS 连接下发送,这会导致在本地开发环境下(通常是 HTTP)出现问题。

此外,确保会话中间件的顺序正确。它应该在任何其他需要读取或写入会话数据的中间件之前使用。

结论

如果你遇到类似的问题,检查以下几点:

  • 确保 cookie.secure 设置正确。
  • 确保会话中间件的顺序正确。
  • 确保在请求处理函数中正确地使用了 req.session

通过以上步骤,你应该能够解决 express-session 无法保存值的问题。


app.use(session({
    secret: 'keyboard cat',
    key: 'sid',
    cookie: { secure: true }
}))

里的 secure 改为 false 就可以了。。这是为什么呢。

遇到了同样的问题,果然改成false就解决了,看了下github上的文档,大概意思是:


推荐选项是将sercure属性的值设为true(即secure: true)。然而,它需要网站是https-enabled,也就是说HTTPS这货对于secure cookies是必须的。

遇到同样的问题,原来要https-enabled…

从你的描述来看,express-session 模块没有正确地保存会话数据。以下是一些可能的原因和解决方案:

  1. 确保 cookiesecure 属性设置正确:如果你的应用不是运行在 HTTPS 上,那么 cookiesecure 属性应该设置为 false

  2. 检查会话中间件的顺序:确保 cookie-parsersession 中间件之前使用。

  3. 会话数据的持久化存储:默认情况下,express-session 使用内存存储会话数据。这在生产环境中不推荐,因为每次重启服务器时会话数据都会丢失。可以考虑使用像 connect-mongoconnect-redis 这样的第三方模块来持久化存储会话数据。

下面是修改后的代码示例:

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var bodyParser = require('body-parser');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(session({
    secret: 'keyboard cat',
    key: 'sid',
    cookie: { secure: false } // 确保设置为 false 如果不在 HTTPS 上运行
}));

var routes = require('./routes/index');
var users = require('./routes/users');

app.use('/', routes);
app.use('/users', users);

app.listen(1111);
module.exports = app;

此外,你可以添加一些调试信息来查看会话数据是否被正确更新:

app.get('/', function(req, res) {
    if (!req.session.views) {
        req.session.views = 0;
    }
    req.session.views++;
    res.end('welcome to the session demo. refresh! ' + req.session.views);
});

这样你可以确认会话数据是否在每次刷新页面时正确增加。如果仍然有问题,建议检查是否有其他中间件或代码干扰了会话数据的保存。

回到顶部