快递,为每个用户保留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。