【问题标题】:Duplicate values when using express and socket.io in nodeJS在 nodeJS 中使用 express 和 socket.io 时重复值
【发布时间】:2013-11-05 02:00:11
【问题描述】:

我有一个使用 express 和 socket.io 的 nodeJS 应用程序。我想隔离一些代码,以便它只在我服务的一页上运行。为此,我使用 express 来监听请求并提供一个 html 页面作为响应。

app.get('/archive', function(request, response) {
    response.sendfile(__dirname + "/views/table.html");
}

我还有一个 socket.io 函数,用于监听并将数据发送到 html 页面。

io.sockets.on('connection', function(socket) {
     channel.subscribe('cheat', function(message) {
      socket.emit('message', message);
});\

当代码是这样的时候,一切都运行良好,但是一旦我尝试将 socket.on 函数放入 app.get 函数中,我就会遇到问题。第一个请求完美运行,但是当页面刷新时,所有数据都会重复。第一次是 x2,然后是 x3,然后是 x4,依此类推。有谁知道为什么会这样?

这是我的最终代码的样子:

app.get('/archive', function(request, response) {
    response.sendfile(__dirname + "/views/table.html");
    io.sockets.on('connection', function(socket) {
        channel.subscribe('cheat', function(message) {
        socket.emit('message', message);
    });
}

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    您不应将 Socket.IO 连接侦听器放在 HTTP 路由中。每次有连接时都会调用 Socket.IO 对象的 connection 事件,因此如果每次调用 HTTP 路由时都创建一个新的连接侦听器,那么您将拥有重复的侦听器,当有连接。

    如果您不想在某个页面上使用 Socket.IO,请不要在该页面上包含客户端脚本。否则,另一种方法是将客户端路径存储在 cookie 中,并在授权期间访问该 cookie。然后您可以接受或拒绝该客户。

    【讨论】:

    • 当我使用 socket.handshake.url 时,我得到一个唯一的 URL (/socket.io/1/?t=128438943) 而不是 /path
    • 抱歉,这似乎是不正确的。我已经修改了答案。
    【解决方案2】:

    我使用 url.parse 函数来获取页面的名称,如下所示:

    var curURL = url.parse(request.url).pathname;
    

    然后我可以查看当前网址

     if (curURL == '/') {
        //code
    }
    

    关于重复值的问题,我忘记在退出时取消订阅。订阅后.unsubscribe();一切正常。

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2018-06-02
      • 2016-12-28
      相关资源
      最近更新 更多