【问题标题】:Socket.io NodeJS chat : Why do messages emit multiple times?Socket.io NodeJS 聊天:为什么消息会多次发出?
【发布时间】:2014-03-19 03:22:20
【问题描述】:

我正在尝试创建一个 nodeJS/Socket.io 聊天应用程序。但是每当我发送一条消息时,它会出于某种原因发出多次。 客户端:

var socket = io.connect();
var $users = $('#users');
var $messageForm = $('#send-message');
var $messageBox = $('#message');
var $chat = $('#chat');

socket.emit('new user', "{{user.username}}", function(data){
    if(data) {
        console.log("Connected");
    }

});

socket.on('usernames', function(data){
    var html = '';
    for(var i=0; i < data.length; i++){
        html += data[i] + '<br/>'
    }
    $users.html(html);
});

$messageForm.submit(function(e){
    e.preventDefault();
    socket.emit('send message', $messageBox.val(), function(data){
        console.log(data);
        $chat.append('<span class="error">' + "asdfasdfaf" + "</span><br/>");
});
    $messageBox.val('');
});

socket.on('load old msgs', function(docs){
    for(var i=docs.length-1; i >= 0; i--){
        displayMsg(docs[i]);
    }
});

socket.on('new message', function(data){
     displayMsg(data);
});

function displayMsg(data){
    $chat.append(
        '<span class="msg"><b>' + 
        data.nick + ': </b>' + data.msg + "</span><br/>");
}

socket.on('whisper', function(data){
    $chat.append(
        '<span class="whisper"><b>' + 
        data.nick + ': </b>' + data.msg + "</span><br/>");
});

这是服务器端代码(此代码在 app.get() 请求中):

io.sockets.on('connection', function(socket){
    var query = Chat.find({});
    query.sort('-created').limit(8).exec(function(err, docs){
    if(err) throw err;
    // socket.emit('load old msgs', docs);
});

socket.on('new user', function(data, callback){
    socket.nickname = req.user.username;
    users[socket.nickname] = socket;
});



socket.on('send message', function(data, callback){
    var msg = data.trim();
    console.log('after trimming message is: ' + msg);
    var name = req.params.posteruname;

    if(name in users){
        users[name].emit('whisper', {msg: msg, nick: socket.nickname});
        console.log('message sent is: ' + msg);
        console.log('Whisper!');
    } else{
        callback('Error!  Enter a valid user.');
    }


});

socket.on('disconnect', function(data){
    delete users[req.user.username];
    updateNicknames();
});

所以基本上问题是每次触发“发送消息”方法时,都会多次发送消息(刷新​​页面的次数)->我确保没有创建新套接字时一个页面由同一个用户刷新,以避免多条消息。但仍然发送多条消息。我已经被困在这里一段时间了。任何帮助表示赞赏!

【问题讨论】:

  • 您说“此代码在 app.get() 请求中”。这意味着每次客户端连接到您的服务器时,都会再次触发 io.sockets.on 。因此,这应该超出您的路线范围。如果您发布完整的服务器代码,那么我可以提供进一步的帮助
  • 是的,这就是问题所在。我将代码移到了 get 请求之外,它不再发出多次了!谢谢!

标签: node.js mongodb sockets callback socket.io


【解决方案1】:

除非收到事件,否则服务器端代码上的侦听器不应采取行动,因此问题可能出在客户端。它不止一次触发服务器消息侦听器.. 尝试任何其他事件,例如 jquery 的 .click(function(){}) 或 on('click',function(){}) ..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2017-03-03
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多