当应该保持不变时,NodeJS redis连接会话ID被重新生成

12

我尝试在NodeJS中使用Redis的标准会话持久化:

var express = require('express');
var RedisStore = require('connect-redis')(express);
var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({ 
    secret: "keyboard cat", 
    store: new RedisStore, 
    key: 'sid' 
  }));
});


app.get('/', function (req, res) {
  if (req.session.isValid) {
    console.log("There is an existing session.");
  }
  else {
    req.session.isValid = true;
    console.log("New session.");
    console.log('Old session ID: ' + req.header('Cookie'));
    console.log('New session ID: ' + req.session.id);
  }

  res.render('index', {'title': s});
});
app.listen(4000);
理论上,我应该只看到一次“新会话”这条线,而所有后续对该网站的调用都应导致“存在会话”。 不幸的是,在每次调用时都会重新生成新的会话ID。浏览器中的cookie运行良好,内容被正确传输,我可以在其中看到它。
req.header('Cookie')

这是控制台日志的样子:

[app.js] New session.
[app.js] Old session ID: undefined
[app.js] New session ID: nuoHKZj2j0AoRkvqT4xE5h6W.zF+DNv2rzr3kpeO2IyD7sa4xdamFQMugjfQvY6OYymE
[app.js] New session.
[app.js] Old session ID: sid=neLUc5PXxPoj1yFqukerv49x.BHzYKiuAfFSNHKd4fCAkv8wNwZO%2FxykJPN5R5tjAlQc
[app.js] New session ID: FvuzjnXvchCkmVqsq5mrodL2.5YlT3InfTbvOwEUc0dNpPLT77tcdJpNuhbFGVYkLneQ
[app.js] New session.
[app.js] Old session ID: sid=pFbyVdlNZXtF5vZ35CW9sfmq.nJ1RBjJu59iUJJjmZv9TCYiYLcvycme%2BJh8sQC6%2FzEE
[app.js] New session ID: KdPhwqwwgmOnPZEuVapy7EJe.I0TGT9HSSQQSporwCNsxl11rXDxR/ysjTeZb0lD5uwI

当我在redis-cli中运行"MONITOR"命令时,同时会得到以下输出:

sess:nuoHKZj2j0AoRkvqT4xE5h6W.zF+DNv2rzr3kpeO2IyD7sa4xdamFQMugjfQvY6OYymE
*2
$3
get
$73
sess:Q6Z06GL4hdRytKA2MToCIgVw.JWxImSB/m20Urn+IYMQqnNqfQp4ygAESiyBLORn3Iuo
*2
$3
get
$73
sess:neLUc5PXxPoj1yFqukerv49x.BHzYKiuAfFSNHKd4fCAkv8wNwZO/xykJPN5R5tjAlQc
*2
$3
get
$73
sess:FvuzjnXvchCkmVqsq5mrodL2.5YlT3InfTbvOwEUc0dNpPLT77tcdJpNuhbFGVYkLneQ 
*2 
$3
get
$73
sess:zvCWdwzowgAfl6jH8m0D31vL.b5tK5VZUJtPHrdvH09A/hjhjoOg6bT0CmAcWWRf99SI
*2
$3
get
$73
sess:pFbyVdlNZXtF5vZ35CW9sfmq.nJ1RBjJu59iUJJjmZv9TCYiYLcvycme+Jh8sQC6/zEE
*2
$3
get
$73
sess:KdPhwqwwgmOnPZEuVapy7EJe.I0TGT9HSSQQSporwCNsxl11rXDxR/ysjTeZb0lD5uwI
*2
$3
get
$73
sess:r793eaJyOnaq2RNyw1Hmpuwv.xnonbOlaWEAlpz+LDg0SHcUeAa0sbjyw0oIcwFmlX0w

当我使用MemoryStore代替RedisStore时,一切都像预期的那样工作。

有什么想法吗?


嗨,Raph - 你解决了这个问题吗?我也遇到了同样的问题:/ - UpTheCreek
升级到新版本的Redis似乎解决了问题。但我仍然不知道问题来自哪里。 - Raph
你是否使用了两个节点?我的意思是一个用于作为Node.js服务器,另一个用于客户端界面,例如React。 - Ishwar Chandra Tiwari
3个回答

0

我曾经遇到过类似的问题。我的会话在每次请求时都被重新生成。我通过在开发所在的虚拟机上设置正确的日期来解决了这个问题。


你的意思是,应用程序虚拟机和Redis虚拟机之间有不同的日期?这个时间差有多大? - UpTheCreek

0

试试这个...

let redisStore,redisClient;
const redis = require('redis');
redisStore = require('connect-redis')(session); 

redisClient = redis.createClient();

redisClient.on('error', (err) => {
    console.log('Error: ', err);
});

app.use(session({
    store   : new redisStore({ host: 'localhost', port: 'port', client: redisClient }),
    name    : 'session_name', 
    resave  : false,
    saveUninitialized: false,
    rolling : true,
}));

注意:Redis 无法在 Windows/本地主机上支持。

-1
当每个请求都重新生成会话时,我遇到了相同的问题。原因是“静态”中间件放置在“会话”中间件下面。因此,请确保以正确的顺序放置中间件,即:
...
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.session({ store: new RedisStore({ prefix: 'sid_' }) }));
app.use(app.router)
app.get ...

'

express.session' middleware 应该在 'static' 中间件之下。

'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接