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
}
});
如前所述,它仅在第二次调用 newboard
和 changeboard
后执行此操作。然后它开始加倍。如果我继续下去,它只会不断翻倍,直到我有 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
消息安装另一个重复的事件处理程序。因此,在调用该函数两次后,该消息有两个事件处理程序,您将处理它两次。
您不能重复添加消息处理程序,除非您同时删除它们(因为您会得到重复的处理程序)。消息处理程序通常应在首次创建套接字连接时添加一次。
我直接从 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 个板并刷新页面。
更新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
消息安装另一个重复的事件处理程序。因此,在调用该函数两次后,该消息有两个事件处理程序,您将处理它两次。
您不能重复添加消息处理程序,除非您同时删除它们(因为您会得到重复的处理程序)。消息处理程序通常应在首次创建套接字连接时添加一次。