快递,为每个用户保留variables

我在Express / Node上使用socket.io

现在我正在使用这个方法:

// get room name from URL var requestRoom; app.get('/editor/:room', function(req, res) { requestRoom = req.params.room; res.render('editor/editor', { title: 'Editor' }); }); // use that room name for private rooms within socket.io io.on('connection', function(socket) { socket.join(requestRoom); // rest of socket.io code.... 

从类似于sitename.io/editor/[room-name]的url抓取room-name

然后,我使用requestRoom作为requestRoom socket.to(requestRoom).broadcast..的variables,用于将套接字数据包发送到特定的房间。


问题

每当新用户访问该应用程序时, requestRoom都会被重新填充以供所有用户使用 ,而不仅仅是刚刚join的用户。

有没有办法为每个“会话”启动一个新的“实例”与自己的variables? 我在这里错过了什么?

您不能为每个会话创build新的实例。

但是,您可以通过从客户端发送房间名称来解决此问题。 当您使用socket.io-client连接到WebSocket时,请将房间名称添加到查询参数中。

客户:

 var requestRoom = "roomName"; io('/', {query: "requestRoom=" + requestRoom}) 

服务器:

 io.on('connection', function(socket) { var requestRoom = socket.request._query.requestRoom; socket.join(requestRoom); // rest of socket.io code.... 

编辑:

尼古拉斯Kyriakides用更简单的方法来解决这个问题。

服务器:

 io.on('connection', function(socket) { var refererSplit = socket.request.headers.referer.split('/'); var requestRoom = refAr[refererSplit.length-1]; //Considering Room name is at the end of the path. socket.join(requestRoom); // rest of socket.io code.... 

不需要从客户端传递roomName。