嗨,我正在使用 socket.io 和 node.js (express.js)。 我看到了很多例子,从 app.js 文件编码。现在我想更好地组织代码,我希望将所有的 sockets.io 处理程序放在其他模块/文件中。
这就是我现在拥有的:
app.js
var moduleExports = require('./routes/moduleExports');
app.get('/', function(req, res){
res.sendfile(path.join(__dirname + '/index.html'));
io.on('connection', function(socket){
moduleExports.socketio(io, socket);
});
});
moduleExports.js
module.exports = {
init: function(){
//some other functions
}, socketio: function(io, socket){
socket.emit('chat', 'Wellcome!');
socket.on('chat', function (data) {
socket.broadcast.emit('chat', data);
//socket.broadcast.emit('chat', data);
});
socket.on('disconnect', function () {
socket.broadcast.emit('chat', 'Disconnected');
//socket.broadcast.emit('chat', data);
});
}
};
问题:
如果我打开 2 个不同的浏览器,一个浏览器用于 John,另一个浏览器用于 Doe。 如果 John 发送一条消息,Doe 会收到两次。如果我再次打开第三个浏览器,并从 John 发送一条消息,Doe 和第三个浏览器将收到三倍的消息。
我不知道为什么会发生这种情况。我知道“moduleExports.js”文件发生了一些事情。但我需要一种方法在 app.js 之外编写我的 socket.io 处理程序。所以我认为这将是一个很好的模式,但事实并非如此。
顺便说一句,客户端代码(它有效):
<script src="/socket.io/socket.io.js"></script>
var socket = io();
function submit(){
socket.emit('chat', $('#m').val());
$('#m').val('');
return false;
}
最佳答案
io.on('connection'
你应该在代码中只拥有一次,每次客户端连接到你的服务器时,都会抛出该事件,如果你多次拥有它,我猜是这样运行更多次。我会做如下:
var moduleExports = require('./routes/moduleExports');
io.on('connection', function(socket){
moduleExports.socketio(io, socket);
});
app.get('/', function(req, res){
res.sendfile(path.join(__dirname + '/index.html'));
});
关于javascript - Socket.io 在处理模块时遇到一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32652568/