Socket.io 从模块处理时遇到一些问题

Socket.io has some trouble when handling from modules

您好,我正在与 socket.io 和 node.js (express.js) 合作。 我看到了很多示例,来自 app.js 文件的编码。现在我想更好地组织代码,我想将我所有的 sockets.io 处理程序放在其他 modules/files.

这是我现在拥有的:

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'));
});