【问题标题】:Socket.io Multiple returns for a single eventSocket.io 单个事件的多次返回
【发布时间】:2015-06-12 22:54:37
【问题描述】:

我直接从 socket.io 网站复制的代码有问题。我有服务器设置,它运行良好。问题是它在第一个事件触发后复制每个事件:

我在这里读到:Socket.io message event firing multiple times

那是因为事件每次都重新注册。但它实际上并没有说明如何阻止和解决这个问题。

由于我的代码是 Socket 网站的直接副本,我真的很困惑,因为多次 Google 搜索只能提供模糊的信息,而且从来没有真正的解决方法。

这是我的基本代码:

var util = require('util'),
    express = require('express'),
    http = require('http').Server(express),
    https = require('https').Server(express),
    io = require('socket.io')(http),
    config = require('./config'),
    phash = require('phpass').PasswordHash,
    bodyParser = require('body-parser'),
    mysql = require('mysql'),
    ip = require('ip');

var connection = mysql.createConnection({
    host: config.dbhost,
    user: config.dbuser,
    password: config.dbpass,
    database: config.dbname
});

var app = express();

connection.connect(function ( err ) {
    if(!err) {
        console.log("Database is connected ... \n\n");  
    } else {
        console.log("Error connecting database ... \n\n");  
    }
});

http.listen(config.port);

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

io.on('connection', function ( socket ) {
    socket.on('newboard', function ( data ) {
        console.log(data);
        connection.query('MYSQL', function ( err, rows, fields ) {
            if (!err) {
                console.log('The solution is: ', rows);
                io.sockets.emit('messageSuccess', { bid: rows.insertId });
            } else
                console.log('Error while performing Query. '+err);
        });
    });

    socket.on('changeboard', function ( data ) {
        console.log(data);
        connection.query('MYSQL', function ( err, rows, fields ) {
            if (!err) {
                console.log('The solution is: ', rows);
                io.sockets.emit('messageSuccess', rows);
            } else
                console.log('Error while performing Query. '+err);
        });
    });
});

更新

根据要求,我的客户端代码:

var socket = io.connect('http://localhost:8080');

socket.emit('newboard', { title: boardTitle, usid: 1 });
socket.on('messageSuccess', function ( data ) {
    bid = data.bid;
});

socket.emit('changeboard', { bid: id });
socket.on('messageSuccess', function ( data ) {
    console.log(data);
    for (i = 0; i < data.length; i++) {
        //Code run on local HTML
    }
});

如前所述,它仅在第二次调用 newboardchangeboard 之后执行。然后它开始加倍。如果我继续前进,它只会继续翻倍,直到我有 30 个板并刷新页面。

更新2

客户区的完整代码可以在这里找到: http://pastebin.com/dkgy4VUx

【问题讨论】:

  • 我在您的服务器代码中看不到任何明显的重复原因。下一个最佳猜测是客户端代码建立了多个连接。我们可以看到客户端代码吗?我确实看到,每次您的服务器从 single 客户端收到消息时,它都会向 所有 客户端发送消息。我猜这不是你的意图。您可以通过使用socket.emit(...) 而不是io.sockets.emit(...) 在您的服务器代码中解决这个问题,只发送到一个套接字。
  • 抱歉耽搁了。我已将上面的客户端代码添加到原始帖子中。
  • 如果可以的话,也显示服务器的输出。这就是说,这段代码很整洁。所以我想知道客户端的订阅/触发事件如何。另外我想知道您是否像 jfriend00 所说的那样误解了服务器端的 io.sockets.emit / socket.emit。

标签: javascript socket.io


【解决方案1】:

我猜这段代码在某种你多次调用的函数中:

socket.emit('changeboard', { bid: id });
socket.on('messageSuccess', function ( data ) {
    console.log(data);
    for (i = 0; i < data.length; i++) {
        //Code run on local HTML
    }
});   

因此,每次调用该函数时,都会为messageSuccess 消息安装另一个重复的事件处理程序。因此,在您调用该函数两次之后,您将拥有该消息的两个事件处理程序,并且您将对其进行两次处理。

您不能重复添加消息处理程序,除非您也删除它们(因为您得到重复的处理程序)。消息处理程序通常应在首次创建套接字连接时添加一次。

【讨论】:

  • 啊哈!好的,所以在文档准备阶段。太好了,但是如果我这样做了,我该如何在事情发生时拨打电话?
  • @jfreak53 - 不是文件准备时间。在您创建套接字之后,您通常会添加事件处理程序。 socket.io 的设计方式,您应该为唯一的事件处理程序使用唯一的消息。因此,您应该能够为给定消息安装一次事件处理程序。所以,不要将messageSuccess 用于两种不同的事情。为每个消息使用不同的名称。
  • @jfreak53 - 更改您的服务器,使其不使用相同的messageSuccess 消息来表示不同的东西。制作changeboardSuccessnewboardSuccess。然后,您可以为每条消息安装一次事件处理程序,而不会重复。
  • @jfreak53 - 就像我已经说过多次一样,您多次致电socket.on('updateboardSuccess', ...)。每次您调用它时,它都会安装另一个事件处理程序,该处理程序将多次处理该消息。例如,每次调用addCard() 时,都会安装另一个socket.on('newcardSuccess', function ( data ) {...}) 事件处理程序来创建重复项。停止多次安装该事件处理程序。 socket 上的事件处理程序不会因为安装它们的功能完成而消失。他们还在那里。
  • @jfreak53 - 可以.emit() 任意多次。这不会安装事件处理程序,只会发送数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2021-12-31
  • 2019-10-30
  • 1970-01-01
  • 2013-05-21
  • 2016-06-23
  • 2013-10-10
相关资源
最近更新 更多