我想将express.js和socket.io会话合并在一起.下面是我的代码(socket.io部分)
var io = require('socket.io').listen(app); io.set('log level',1); io.sockets.on('connection',function (socket) { console.log('client connected'); client.send(client.id);//send client id to client itself socket.on('connect',function(){ console.log(socket.id + ' connected'); }); socket.on('disconnect',function(){ console.log(socket.id + ' disconnected'); }); });
我的express.js会话设置:
app.configure(function() { //app.use(express.logger()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.static(__dirname + '/static')); app.use(express.cookieParser()); app.use(express.session({store: MemStore({ reapInterval: 60000 * 10 }),secret:'foobar',key: 'express.sid' }));
我的主要问题是在我的终端中,当用户从一个网址移动到另一个网址时,会话ID也会发生变化:但我不希望它被更改.
info - socket.io started client connected client connected 4Z0bYHzfWCEFzbbe4WUK disconnected e_uSvxhSLbLAC9-F4WUL disconnected client connected bKDy90gsrWWTRJDD4WUM disconnected client connected RJ5qqCL2wfmXbd7U4WUN disconnected client connected wjN5Sqx4rucRtWL_4WUO disconnected
解决方法
您正在输出套接字ID,而不是express.js中的会话ID.
您必须使用授权事件,其第一个参数是一个具有名为sessionID的条目的对象.该值不应在页面重新加载之间更改,因为它存储在cookie(或redis数据库或其他)中.
这是一篇很好的文章,解释它是如何工作的:http://www.danielbaulig.de/socket-ioexpress/,但它有点过时了.基本原则保持不变,但一些细节已经改变.例如,他创建服务器的方式不再起作用,连接开发人员已经删除了parseCookie().用户是not happy,但是解决方法是这个易于记忆的代码行:
connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)),secret);
正如我所说,上面提到的文章应该为您提供所需的所有基础知识,如果您想查看有效的实现,请查看:https://github.com/vortec/lolbr/blob/master/lib/lolbr.js
在授权事件处理程序中,您可以修改数据对象并在以后使用socket.handshake访问它,在您的情况下:socket.handshake.sessionID.
希望有所帮助.