javascript - Socket.io 在处理模块时遇到一些问题

标签 javascript node.js socket.io

嗨,我正在使用 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/

相关文章:

linux - 执行 npm install -g 时会发生什么

Javascript 对象数组转 Json

node.js - 使用jsdom解析html文件体

javascript - Node 未找到 html 中包含的 js 文件

Node.js Socket.io WebSocket Nginx 配置?

javascript - 动态添加一个select元素到div,mousedown事件阻止下拉菜单打开

javascript - 内容导出服务器错误

javascript - 读取 .config 文件

ios - 如果连接了 Socket.io,Alamofire 请求总是失败并返回 "The request timed out"

javascript - 将宽度应用于绝对定位的元素出错