套接字.IO在处理模块时遇到一些麻烦

Socket.io has some trouble when handling from modules

本文关键字:遇到 麻烦 模块 IO 处理 套接字      更新时间:2023-09-26

嗨,我正在使用套接字。IO和node.js (express.js)。我看到了很多例子,从app.js文件中编码。现在我想组织更好的代码,我想有我所有的socket。其他模块/文件中的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);
            });
    }
};

问题:

如果我打开两个不同的浏览器,一个是约翰的浏览器,一个是Doe的浏览器。如果约翰发了一条信息,他会收到两次。如果我再次打开第三个浏览器,并从John发送消息,那么Doe和第三个浏览器将收到三次消息。

我不知道为什么会发生这种事。我知道"moduleExports.js"文件发生了一些事情。但我需要一种方法来编码我的插座。app.js外部的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'));
});