Строя чат с socket.io, я пришел с ошибкой, которая кажется мне элементарной, но я не могу найти ответ.
Количество опубликованных сообщений после обновления страницы одинаково с обновлениями страницы (я публикую только один раз).
Я проверил похожие ответы, такие как socket-io-множественные чаты-on-one-page сокет-io-несколько-соединений-при обновлении-страница node-js-сокет-io-страница-обновить-множественные соединения Основное отличие от вышеизложенного состоит в том, что количество подключенных разъемов в консоли является правильным.Я также попробовал решение node-js-socket-io-page-refresh-множественные соединения
var socket = io({transports: ['websocket'], upgrade: false});
, но безрезультатно.Я также пробовал комнаты и пространства имен.
Протестировано на Chrome 72, Canary 74.
Вот часть моего сервера
io.sockets.on('connection', function (socket) {
socket.on('subscribe', function(data) { socket.join(room); })
socket.on('unsubscribe', function(data) { socket.leave(room); })
socket.on("newchatsent", function (msg) {
//save chat to mongo
MongoClient.connect(url, {useNewUrlParser: true}, function (err, client) {
if (err) {
console.error('An error occurred connecting to MongoDB: ', err);
} else {
var db = client.db(database);
var collection = db.collection("chat");
collection.updateOne({"cid": cid},{
$push: {"chat": {u: who, c: msg, t: timestamp}},
"$inc": {"total": 1}, "$inc": {[unread]: 1}
}, function (err, result) {
if (err) {
console.log(err);
} else {
//emit data to frontend
socket.emit("newchatreply", msg);
client.close();
}
assert.equal(err, null);
});
}
});
});
});
И вот часть клиента
var socket = io({transports: ['websocket'], upgrade: false});
socket.emit("subscribe", room);
$(document).on('keypress', function (e) {
if (e.which == 13 && $("#chatText").is(":focus")) {
var mes = $('#chatText').val().trim();
if (mes != "") {
socket.emit('newchatsent', mes);
$('#chatText').val('');
return false;
}
}
});
socket.on('newchatreply', function(msg){
$( "#chati" ).append( "<div id='chatLine'><p class='triangle-isosceles right'>"+ msg +"</p>" +
"<div class='chatDatetime'>"+date('Y-m-d H:i')+"</div></div>");
});
Нет случаев предотвращения обновления - окно чата должно быть открыто на нескольких страницах.Есть мысли?
Решение
Предоставлено Шрирам Кайласам : Проблема в том, что вы регистрируете новый обработчик событий каждый раз при перезагрузке страницы.Это приводит к тому, что данные отправляются несколько раз.У меня была та же проблема, и я решил с помощью io.once()
вместо io.on()
на сервере.