Socket.io 多个 returns 一个事件

Socket.io Multiple returns for a single event

我直接从 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

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

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 消息安装另一个重复的事件处理程序。因此,在调用该函数两次后,该消息有两个事件处理程序,您将处理它两次。

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