Задать вопрос
@Juventino96

Проблема с socket io?

Когда пишу сообщение в чате он добавляется и socket io работает но только в том браузере из которой писали в других местах не обновляется.

socket.on('connect', function () {
        $('body').on('click', '.chat-app-messenger-editor button.btn', function (e) {
            e.preventDefault();

            $('.chat-app-loading').css('display', 'block');

            socket.emit('add new message', {
                roomId: $('.chat-app').attr('data-room-id'),
                message: $('#chat-app-messenger-message').val()
            });

            $('#chat-app-messenger-message').val('');
        });

        socket.on('new message', function (data) {
            console.log(data);

            $('.chat-app-loading').css('display', 'none');

            $('.chat-app-messenger ul').append(data);
        });
    });


io.on('connection', function(socket) {
        socket.on('add new message', function (data) {
            if (! data.message || 0 === data.message.length) {
                socket.emit('new message', 'Message can\'t be blank');
            } else {
                ChatMessages.create({
                    room_id: data.roomId,
                    message: data.message,
                    username: socket.request.session.user.username
                }, function(error, newMessage){
                    if(error) throw error;

                    ChatMessages.findOne({_id: new ObjectID(newMessage._id), room_id: new ObjectID(data.roomId)}, function (error, message) {
                        if(error) throw error;

                        var fileHtml = fs.readFileSync(process.cwd() + '/app/views/partials/chat-message.ejs', 'utf8');
                        var html = ejs.render(fileHtml, {
                            message: message,
                            timeago: timeago
                        });

                        socket.emit('new message', html);
                    });
                });
            }
        });
    });
  • Вопрос задан
  • 253 просмотра
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vshvydky
1. чаты делятся на комнаты, реализуешь протокол, можно типо ирц. Например есть на сервере подписка request:join
Когда твой клиент решает войти в определенный чат, он делает отправку запроса на сервер emit('request:join', roomName); на сервере есть реакция, обработка можно ли клиенту присоединиться к этому чату или нельзя.
2. в обработке события на сервере у тебя идет on('request.join', roomName=>socket.join(roomName); В этот момент надо перебрать все активные сокеты, на предмет того, используется ли клиентом второе окно (если это требуется конечно).
3. По этому принципу можно строить и общие чаты, и приватные. Люди начинают общаться не друг с другом, а писать в канал. клиент пишет emit('message:send", {room: id, message}), на сервере это пересылается в рум как .on('message:send', message=> io.to(message.room).emit(message.message)
В результате получается что клиенты общаются между собой, но по факту лишь шлют все данные своему серверу, а он уже принимает решение уведомить об этом остальных или нет.
Ответ написан
Комментировать
megafax
@megafax
web-программист
Присоединяюсь к более обширному ответу Виталий. В Вашем случае Вы отправляете сообщение только конкретному сокету, а не всем зантересованным
socket.emit('new message', html);
А следовало что то вроде
io.in('some-room').emit('new message', html);
ну или вообще накройняк
io.emit('new message', html);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы