Socket.io单个事件的多个返回

时间:2015-06-12 22:54:38

标签: javascript socket.io

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

enter image description here

我在这里阅读: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个板子并刷新页面。

UPDATE2

客户区的完整代码可在此处找到: http://pastebin.com/dkgy4VUx

1 个答案:

答案 0 :(得分: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消息安装另一个重复事件处理程序。因此,在您将该函数调用两次后,您将为该消息提供两个事件处理程序,并且您将对其进行两次处理。

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