2014-03-19 43 views
1

我想創建一個nodeJS/Socket.io聊天應用程序。但是每當我發送消息時,都會因爲某種原因發出多個時間。 客戶端:Socket.io NodeJS聊天:爲什麼消息發出多次?

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

所以基本上問題是,每一次,「發送消息'方法被觸發時,消息被多次發送(刷新頁面的次數) - >當一個頁面被同一用戶刷新時,我確保不會創建一個新的套接字,以避免多個消息。但是仍然發送多條消息。我在這裏呆了一段時間。任何幫助表示讚賞!

+1

你說這個代碼在app.get()請求中「。這意味着每次客戶端連接到您的服務器時,io.sockets.on會再次被觸發。所以這應該超出你的路線範圍。如果您發佈了完整的服務器代碼,那麼我可能會進一步提供幫助 –

+0

是的,這是導致問題的原因。我將代碼移到get請求之外,並且不再發出多次!謝謝! – blehadfas1

回答

0

您的服務器端代碼的偵聽器不應該採取行動,除非它收到一個事件,因此問題可能在客戶端。它是觸發器服務器消息監聽器多於一次.. 嘗試像jQuery的.click(function(){})或on('click',function(){})的任何其他事件..