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

#node.js #reactjs #socket.io

#node.js #reactjs #socket.io

Вопрос:

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

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

сервер:

 var users = {};
io.on('connection', function(socket){ 
    socket.on('user_email', (data) => {
        console.log('user_email event called!');
        users[data.email] = socket.id;
    });
    socket.on('sent_message',(data)=>{
        console.log('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.log('client side',data);
    })
}
 

socket.js

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

export default socketIOClient(CONFIG.API_BASE_URL);
 

Комментарии:

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

Ответ №1:

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

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

// and

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

А на сервере у вас есть

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

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

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

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

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

Комментарии:

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

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

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

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

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