socket.io-клиент включен (‘сообщение’) не работает

#node.js #react-native #socket.io

#node.js #реагирует на собственный #socket.io

Вопрос:

Я использую socket.io-client в приложении чата react native. Сокет нормально подключается и отвечает на on (‘connection’), но не отвечает на сообщения. Как правильно настроить socket.io-client для обработки пользовательских событий? Вся документация, которую я нахожу, похожа на мою реализацию. Мой модуль обмена сообщениями:

 import io from 'socket.io-client';
Messenger = (props) => {
  const [data, setData] = useState([]);
  const [test, setTest] = useState('');

  const socket = io('https://test.com', {
    autoConnect: false,
  });

  const getCredentials = async () => {
    await socket.connect();
    await fetchMessages();
  }

  useEffect(() => {
    socket.connect();

    socket.on('connect', function() {
      setTest('connected!');
    });

    socket.on('message', function(message) {
      setTest('message!');
    });

    socket.on('typing', function(typing) {
      setTest('typing');
    });
    getCredentials();
  }, []);

  return (...);
}
  

Мой сервер:

 var socket_io = require( 'socket.io' );
const io = socket_io();
io.use((socket, next) => {
  sessionMiddleware(socket.request, {}, next);
});
io.on( "connection", function( socket )
{
  if (socket.request.session.auth_user) {
    redisClient.set(socket.request.session.auth_user._id.toString(), socket.id);

    socket.on( "disconnect", function() {
      console.log( "A user disconnected" );
      redisClient.del(socket.request.session.auth_user._id);
    });
  }
});
  

Ответ №1:

Это действительно трудно сказать, не видя вашего сервера, но если сравнивать ваш случай с моим случаем, это должно быть что-то вроде этого:

 useEffect(() => {
    const socket = io('https://test.com', {
        autoConnect: false,
    });

    socket.on('connect', function () {
        setTest('connected!');

        socket.on('message', function (message) {
            setTest('message!');
        });

        socket.on('typing', function (typing) {
            setTest('typing');
        });
    });
  

}, []);

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

1. Я добавил код сервера. Код, который я использую в react native, — это тот же код, который я использую в своем рабочем настольном клиенте.

2. Разве у вас не должно быть socket.emit('message',...) на вашем сервере, чтобы перехватить сообщение в вашем клиентском приложении?

3. Я использую socket.emt(‘message’, …) в функции обмена сообщениями позже в коде.

4. Я только что понял, что мой сервер не распознает соединения с react native.

5. Вы устранили проблему? Вы запускаете сервер на локальном хосте?