在 node.js 和 express 中,有很多例子展示了如何获取会话数据。
正如您在访问第三个链接时所看到的,它是指向 StackOverflow 的链接。有一个很好的答案,但正如@UpTheCreek 在这些评论中指出的那样,connect 不再具有 parseCookie 方法。我也遇到了这个问题。我发现的所有教程都使用parseCookie
了现在不存在的 connect 方法。所以我问他我们如何获得会话数据,他说他不知道最好的方法,所以我想我会在这里发布问题。使用express@3.0.0rc4
, socket.io
, 和redis
时,我们如何获取会话数据并使用它来授权用户?我已经能够使用require('connect').utils.parseSignedCookie;
,但是当我这样做时,握手时总是会收到警告/错误,
warn - handshake error Error
从我读过的内容来看,这听起来无论如何都不是一个永久的解决方案。
更新
好的,我开始session.socket.io
在我的服务器上工作。正如我所怀疑的那样,我被困在了授权点。我想我可能会以错误的方式解决这个问题,所以请随时纠正我。在我的 Redis 数据库中,我将拥有用户的信息。他们第一次登录时,我想更新他们的 cookie,以便它包含他们的用户信息。然后下次他们回到网站时,我想检查他们是否有 cookie 以及用户信息是否存在。如果它不存在,我想将它们发送到登录屏幕。在登录屏幕上,当用户提交信息时,它会根据 Redis 数据库测试该信息,如果匹配,它将使用用户信息更新 cookie。我的问题是:
1) 如何通过 RedisStore 更新/更改 cookie?
2) 看起来会话数据只保存在 cookie 中。如果有人关闭了 cookie,我如何逐页跟踪用户信息?
这是我的适用代码:
//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');
app.configure(function(){
//...hiding unapplicable code...
app.use(cookieParser);
app.use(express.session({secret: 'secret', store: redis_store}));
});
//...hiding code that starts the server and socket.io
var SessionSockets = require('session.socket.io');
var ssockets = new SessionSockets(io, redis_store, cookieParser);
io.configure(function(){
io.set('authorization', function(handshake, callback){
if(handshake.headers.cookie){
//var cookie = parseCookie(handshake.headers.cookie);
//if(cookie.user){
// handshake.user = cookie.user;
//}
}
callback(null, true);
});
});
ssockets.on('connection', function(err, socket, session){ ... });