表达,为每个用户保留变量

时间:2015-11-28 15:54:10

标签: node.js express socket.io

我在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 ;? 我在这里缺少什么?

1 个答案:

答案 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。