我在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....
从类似room-name
的网址中抓取sitename.io/editor/[room-name]
。
然后我使用requestRoom
作为socket.to(requestRoom).broadcast..
的变量来将套接字数据包发送到特定的房间。
问题
每次新用户访问该应用时,requestRoom
都会为所有用户重新填充 ,而不仅仅是刚刚加入的用户。
有没有办法开始一个新的'实例'为每个会话提供自己的变量&#39 ;? 我在这里缺少什么?
答案 0 :(得分:2)
您无法为每个会话创建新实例。
但是,您可以通过从客户端发送房间名称来解决此问题。 使用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....
编辑:
Nicholas 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。