Я создаю прототип для карточной игры, у меня есть веб-версия игры, в которой я подключаюсь к 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
}