我遇到了直接从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
}
});
如前所述,它仅在第二次调用newboard
和changeboard
后执行。然后它开始加倍。如果我继续前进它只是不断加倍,直到我有30个板子并刷新页面。
UPDATE2
客户区的完整代码可在此处找到: http://pastebin.com/dkgy4VUx
答案 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
消息安装另一个重复事件处理程序。因此,在您将该函数调用两次后,您将为该消息提供两个事件处理程序,并且您将对其进行两次处理。
您不能重复添加消息处理程序,除非您也删除它们(因为您获得了重复的处理程序)。首次创建套接字连接时,通常应添加一次消息处理程序。