在node.js和express中,有许多示例演示如何获取会话数据。
正如您在访问第三个链接时所看到的,这是一个指向StackOverflow的链接。有一个很好的答案,但正如@UpTheCreek在这些评论中所指出的,connect已经没有parseCookie方法了。我也遇到了这个问题。我发现的所有教程都使用了connect的parseCookie方法,现在还不存在。所以我问他如何获得会话数据,他说他不知道最好的方法,所以我想我应该在这里发布这个问题。当使用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)看起来会话数据只保存在cookies中。如果有人关闭了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){ ... });发布于 2013-03-27 21:29:50
切换到session.socket.io一段时间后,由于加载会话信息时模块的异步性质,我遇到了一些问题。因此,我最终创建了自己的模块session.io。它是这样使用的:
var express = require('express');
var app = express();
var server = require('http').createServer(app);
//Setup cookie and session handlers
//Note: for sessionStore you can use any sessionStore module that has the .load() function
//but I personally use the module 'sessionstore' to handle my sessionStores.
var cookieParser = express.cookieParser('secret');
var sessionStore = require('sessionstore').createSessionStore();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
//...truncate...//
app.use(cookieParser);
//make sure to use the same secret as you specified in your cookieParser
app.use(express.session({secret: 'secret', store: sessionStore}));
app.use(app.router);
});
app.get('/', function(req, res){
res.send('<script src="/socket.io/socket.io.js"></script><script>io.connect();</script>Connected');
});
server.listen(app.get('port'), function(){
console.log('Listening on port ' + app.get('port'));
});
var io = require('socket.io').listen(server);
io.configure(function(){
//use session.io to get our session data
io.set('authorization', require('session.io')(cookieParser, sessionStore));
});
io.on('connection', function(socket){
//we now have access to our session data like so
var session = socket.handshake.session;
console.log(session);
});发布于 2012-10-11 14:27:35
看看Socket.IO的维基。特别是零件配置Socket.IO和授权与握手。
它展示了如何将socket.io与RedisStore一起使用,并给出了两种不同的授权方法。
有关连接速递v3、redis和socket.io的更多信息
发布于 2012-10-16 21:11:51
你的问题:
Cookie/Session/ RedisStore思考:
示例node.js代码:
var app = express.createServer(
express.static(__dirname + '/public', { maxAge: 31557600000 }),
express.cookieParser(),
express.session({ secret: 'secret', store: new RedisStore({
host: 'myredishost',
port: 'port',
pass: 'myredispass',
db: 'dbname',
}, cookie: { maxAge: 600000 })})
);会话和Cookie的想法:
https://stackoverflow.com/questions/12801027
复制相似问题