【问题标题】:Express specific socket.io connections per page每页表达特定的 socket.io 连接
【发布时间】:2016-07-12 06:55:13
【问题描述】:

所以目前我的设置是我有一个标准的 app.get('/', etc 作为我的索引,在这里,我有我的 io.on('connection', function etc)。现在的目标是让每个当某人仅连接到主页时,我可以使用 io.on(connection 获取该套接字并以这种方式向其发送内容,并且我的语法和一切都很好,但是我相信在路由中拥有我的 io.on('connection' 是我的问题。

问题:每当有人在我启动服务器后连接到我的网站时,它都运行良好,对于调试示例,我在其中有一个 console.log,它被调用一次,我们很好。但是,如果同一个人重新加载页面,我的 io.on('connection' 会再次被调用,这一次我将得到 2 个 console.log ......当我再次重新加载时,我会得到 3 个等等,依此类推,不管如果我关闭页面并重新打开它或来自不同的 IP。似乎在我重新加载时连接没有关闭,并且在我重新加载时调用所有仍然挂起的连接。

我知道这有点不正统,因为我不发布我的代码。它不是语法,这里是一个基本上描述的设置的例子。哦,我还需要从 app.get 访问 req 输入,这就是为什么它首先在那里,我在其中保存了护照变量。

app.get('/', function (req, res) {
    res.sendFile(__dirname + '/index.html');

    io.on('connection', function(socket){
        console.log("1 connection");
   });

});

我希望这能很好地解释我的问题。当我首先寻找答案时,我发现了一堆关于路由的东西,但很困惑。任何帮助表示赞赏!

【问题讨论】:

    标签: node.js express socket.io routes


    【解决方案1】:

    对于我从问题和 cmets 中得到的信息。 你做错了。切勿将套接字连接的 ON 和 EMIT 放在多次调用它们的位置,因为它们每次都会附加。

    例如:第一次调用这个

    app.get('/', function (req, res) {
        res.sendFile(__dirname + '/index.html');
        io.on('connection', function(socket){
            console.log("1 connection");
       });
    });
    

    io.ons['connection'] 有值

    function(socket){
       console.log("1 connection");
    }
    

    第二次调用它时,回调将再次附加io.ons['connection'] 的值现在是

    function(socket){
        console.log("1 connection");
    }
     function(socket){
        console.log("1 connection");
    }
    

    所以它会打印两次 console.log

    第二: 如果您想在用户登录后做进一步的工作。那么您需要在此处验证用户,您可以在客户端使用socket.emit('init',..... 而服务器端socket.on('init',...... 将验证用户并可以访问 else 返回并关闭连接。

    【讨论】:

      【解决方案2】:

      永远不要将像io.on() 这样的事件处理程序放在app.get() 处理程序中。那是错误的,甚至不会接近你想要的。在有人点击您的页面之前,它不会有一个事件处理程序,然后每次有人点击该页面时,它都会添加一个重复的事件处理程序。这两个都是错误的。

      结构应该是这样的:

      // watch for people hitting the / route in the browser
      app.get('/', function (req, res) {
          res.sendFile(__dirname + '/index.html');
      });
      
      // listen for incoming webSocket connections
      io.on('connection', function(socket){
          console.log("new connection");
      });
      

      这将防止您获得重复的事件处理程序。

      如果您尝试仅从特定页面侦听传入的 socket.io 连接,则这不是支持功能。 Socket.io 连接来自浏览器,而不是来自特定路由。您可以访问与托管页面关联的 cookie 和网页中的代码,使浏览器可以连接到特定命名空间之类的东西,但是传入的 socket.io 连接和特定路由之间没有内置关联http请求的方式。

      如果您尝试从传入的 socket.io 连接访问会话对象,通常可以通过与 socket.io 连接的开始相关联的 cookie 来完成。

      【讨论】:

      • 但我不想做任何我在 io.on('connection' 下设置的东西,除非它们在主页上,因为这样可以确保他们登录并且我可以获得他们的用户请求中的名称。我不应该用 cookie 来做,我确定还有其他方法可以做到这一点。
      • @Ralph - 你根本无法像以前那样做。由于多种原因,它无法正常工作。相反,您必须使用 cookie 来查看正在连接的用户是否经过身份验证以及他们是谁。 webSocket/socket.io 连接并不真正了解它们从哪个页面连接。他们是连接到您的服务器的用户,并且未经身份验证或身份验证/识别信息来自 cookie。如果页面本身只需要某种类型的信息,那么它可以向服务器发送消息来请求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2016-02-21
      相关资源
      最近更新 更多