Socket.io чат несколько сообщений после обновления страницы - PullRequest
0 голосов
/ 22 февраля 2019

Строя чат с socket.io, я пришел с ошибкой, которая кажется мне элементарной, но я не могу найти ответ.

Количество опубликованных сообщений после обновления страницы одинаково с обновлениями страницы (я публикую только один раз).

Я проверил похожие ответы, такие как socket-io-множественные чаты-on-one-page сокет-io-несколько-соединений-при обновлении-страница node-js-сокет-io-страница-обновить-множественные соединения Основное отличие от вышеизложенного состоит в том, что количество подключенных разъемов в консоли является правильным.Я также попробовал решение node-js-socket-io-page-refresh-множественные соединения

var socket = io({transports: ['websocket'], upgrade: false});

, но безрезультатно.Я также пробовал комнаты и пространства имен.

enter image description here Протестировано на 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() на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...