React Native socket-io - полученные данные не были строкой или не были распознанной кодировкой - PullRequest
0 голосов
/ 15 февраля 2019

Я создаю прототип для карточной игры, у меня есть веб-версия игры, в которой я подключаюсь к socket.io.он отлично работает во всех основных браузерах.

Код из версии веб-приложения

import io from 'socket.io-client'

export const connectToSocket = (uid, cb) =>  {
  socket = io.connect(domain, { path: '/api/v1/streams/socket/', query: 'token='+uid})

  socket.on('connect', function(){
      console.log('Socket connected')
  });

  socket.on('message', function(data){
      cb([null,JSON.parse(data)])
  });

  socket.on('connect_error', err => cb([err, null]))
  socket.on('disconnect', function(){cb([400, null])});
} 

, однако, когда я пытаюсь подключиться из собственного кода реакции, я получаю сообщение об ошибке

Полученные данные не были строкой или не были распознанной кодировкой.

Реагирует на собственный код

import io from 'socket.io-client'
let socket

export const connectToSocket = (uid, cb) =>  {
   socket = io.connect({path: '/api/v1/streams/socket/', query: `token=${uid}`})
}

Я прочитал все сообщения на stackoverflow и git, и, похоже,Мне решение, которое работает почти для всех, форсирует транспорт веб-сокетов, а не объединяет их.Например:

   socket = io.connect({path: '/api/v1/streams/socket/', query: `token=${uid}`, transports: ['websocket']})

однако это решение не работает для меня.Я знаю, что бэкэнд работает нормально, так как версия веб-приложения может подключаться.Кроме того, когда я отправляю запрос на соединение с «native native», серверная сторона регистрирует то, что должна.

Хотя на стороне сервера работает нормально, вот код для события подключения

func (s *sockets) socketHandleConnectionEvent(so socketio.Socket) {
  token := so.Request().URL.Query().Get("token")
  uid, err := g.f.verifyToken(token)
  if err != nil {
      fmt.Println("Could not verify token")
      return
  }

  //Connect user
  s.clients.set(uid, so)

  // Check if player is currently in a room
  inRoom, roomID, err := IsPlayerInRoom(uid)
  if err != nil {
      fmt.Println("Error: Checking player is in room")
  }

  if inRoom == true {
      fmt.Println("REJOINING ROOM")
      so.Join(roomID)
      SendCurrentGameState(roomID, uid)
      return
  }

  gameID, gameStarted := GenerateRoom(uid)
  so.Join(gameID)
  SendCurrentGameState(gameID, uid)

  if gameStarted {
      s.addTimer(gameID, uid)
  }

  return
}
...