Express,为每个用户保留变量

Express, keep variables for each user

我在 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 作为 socket.to(requestRoom).broadcast.. 的变量,用于将套接字数据包发送到特定房间。


问题

每次新用户访问该应用程序时,requestRoom 都会为所有用户重新填充,而不仅仅是为刚刚加入的用户。

有没有办法用每个 'session' 的变量来启动一个新的 'instance'? 我在这里错过了什么?

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

但是,您可以通过客户端发送房间名称来解决此问题。 当您使用 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。