Socket.on не прослушивает событие

Я создаю простое приложение для частного и группового чата, используя react.js, node.js и socket.io. У меня сгенерировал событие при отправке формы. И на стороне сервера, и на стороне клиента я слушал это событие.

На стороне сервера работает нормально, а на стороне клиента событие не прослушивается. Ниже приведен код на стороне клиента и на стороне сервера:

сервер:

var users = {};
io.on('connection', function(socket){ 
    socket.on('user_email', (data) => {
        console.info('user_email event called!');
        users[data.email] = socket.id;
    });
    socket.on('sent_message',(data)=>{
        console.info('data is ',data);
    })
});

клиент:

import socket from '../../socket';

handleSubmit(e){
     e.preventDefault();
     let email = window.localStorage.getItem('email');      
     let message = this.state.message;
     if (message){
        socket.emit('sent_message',{email:email,message:message});
    }
    socket.on('sent_message',(data)=>{
        console.info('client side',data);
    })
}

сокет.js

import socketIOClient from "socket.io-client";
import { CONFIG } from './config';

export default socketIOClient(CONFIG.API_BASE_URL);

в файле конфигурации

Rajat 19.04.2019 14:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
578
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем клиентском коде у вас есть:

socket.emit('sent_message',{email:email,message:message});

// and

socket.on('sent_message',(data)=>{
    console.info('client side',data);
})

А на сервере у тебя

socket.on('sent_message',(data)=>{
    console.info('data is ',data);
})

Но на вашем сервере нет ...emit('sent_message', ...), поэтому ваш клиент никогда ничего не получит.

Попробуйте использовать

io.to(socket.id).emit('sent_message', data);

внутри кода вашего сервера, внутри обработчика socket.on('sent_message', ...) вместо console.info('data is ', data);

могу ли я использовать socket.emit внутри socket.on?

Rajat 19.04.2019 14:15

используйте io.to(socket.id).emit(), чтобы отправить излучение в этот сокет, в частности. Вместо этого вы можете использовать .broadcast(), если хотите, чтобы все подключенные клиенты получали, но пока попробуйте это, чтобы устранить проблему. Кроме того, да, чтобы ответить на ваш вопрос - вы тоже должны это сделать. socket.io/docs/server-api/…

Deryck 19.04.2019 14:16

Я реализую групповой чат, поэтому мне не нужно использовать io.to(socket.id).emit?

Rajat 19.04.2019 14:20

Если вы делаете групповой чат, вам нужно использовать пространства имен или комнаты, чтобы изолировать, кто получает сообщения. Он по-прежнему будет транслироваться, но только для людей, подписавшихся на лайки /group1 и т. д. — см. это для этого socket.io/docs/server-api/#socket-rooms

Deryck 19.04.2019 14:22

большое спасибо брат. Если мне понадобится ваша помощь в будущем, вы можете мне помочь?

Rajat 19.04.2019 14:29

извини братан я не могу заплатить

Rajat 19.04.2019 14:46

ну ладно, если я увижу здесь больше вопросов, я сделаю все, что смогу :)

Deryck 19.04.2019 15:02

Спасибо большое. socket.broadcast.emit('') не передает событие всем клиентам.

Rajat 19.04.2019 15:07

да, как я упоминал в конце того другого сообщения, вы все еще можете использовать socket.emit('message', ...) внутри socket.on(...), я просто использовал его очень специфическим образом в последнее время, поэтому моя предвзятость мешала. Например: socket.on('echo', function ( data ) { socket.emit('success', { hello: 'world' }); });

Deryck 19.04.2019 15:11

но socket.emit("") не передает сообщение всем подключенным клиентам.

Rajat 19.04.2019 15:14

пожалуйста, взгляните на мой код на стороне сервера: pastebin.com/QgWS5fqS

Rajat 19.04.2019 15:17

попробуйте заменить socket.broadcast.emit('sent_message',data); на socket.emit('sent_message',data);. эти документы должны быть для вас довольно хорошим ресурсом здесь, хотя

Deryck 19.04.2019 15:53

Я добавил socket.broadcast.emit и socket.emit, и теперь он работает нормально.

Rajat 20.04.2019 11:48

Другие вопросы по теме