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();
});
所以基本上問題是,每一次,「發送消息'方法被觸發時,消息被多次發送(刷新頁面的次數) - >當一個頁面被同一用戶刷新時,我確保不會創建一個新的套接字,以避免多個消息。但是仍然發送多條消息。我在這裏呆了一段時間。任何幫助表示讚賞!
你說這個代碼在app.get()請求中「。這意味着每次客戶端連接到您的服務器時,io.sockets.on會再次被觸發。所以這應該超出你的路線範圍。如果您發佈了完整的服務器代碼,那麼我可能會進一步提供幫助 –
是的,這是導致問題的原因。我將代碼移到get請求之外,並且不再發出多次!謝謝! – blehadfas1