【发布时间】: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
}
});
如前所述,它仅在第二次调用 newboard 和 changeboard 之后执行。然后它开始加倍。如果我继续前进,它只会继续翻倍,直到我有 30 个板并刷新页面。
更新2
客户区的完整代码可以在这里找到: http://pastebin.com/dkgy4VUx
【问题讨论】:
-
我在您的服务器代码中看不到任何明显的重复原因。下一个最佳猜测是客户端代码建立了多个连接。我们可以看到客户端代码吗?我确实看到,每次您的服务器从 single 客户端收到消息时,它都会向 所有 客户端发送消息。我猜这不是你的意图。您可以通过使用
socket.emit(...)而不是io.sockets.emit(...)在您的服务器代码中解决这个问题,只发送到一个套接字。 -
抱歉耽搁了。我已将上面的客户端代码添加到原始帖子中。
-
如果可以的话,也显示服务器的输出。这就是说,这段代码很整洁。所以我想知道客户端的订阅/触发事件如何。另外我想知道您是否像 jfriend00 所说的那样误解了服务器端的 io.sockets.emit / socket.emit。
标签: javascript socket.io