7

我想将 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'
}));

我的主要问题是在我的终端中,当用户从一个 URL 移动到另一个 URL 时,会话 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
4

1 回答 1

6

您正在输出套接字 ID,而不是 express.js 中的会话 ID。

您必须使用该authorization事件,它的第一个参数是一个对象,它有一个名为 的条目sessionID。该值不应在页面重新加载之间更改,因为它存储在 cookie(或 redis 数据库或其他任何内容)中。

这是一篇很好的文章,解释了它是如何工作的:http ://www.danielbaulig.de/socket-ioexpress/ ,但它有点过时了。基本原则保持不变,但一些细节发生了变化。例如,他创建服务器的方式不再起作用,连接开发人员已经删除了parseCookie(). 用户对这个决定不满意,但是解决方法是这个易于记忆的代码行:

connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret);

正如我所说,上面提到的文章应该为您提供所需的所有基础知识,如果您想查看有效的实现,请查看:https ://github.com/vortec/lolbr/blob/master/lib/大声笑.js

authorization事件处理程序中,您可以修改data对象并稍后使用 访问它socket.handshake,在您的情况下:socket.handshake.sessionID

希望有帮助。

于 2012-08-06T12:59:11.983 回答