Primera vez que uso websockets con Go y obtengo un error extraño que no interrumpe el programa, y aún continúa como si no fuera un problema. El cliente es una aplicación de página única de ReactJS.
Cliente JS:
const socket = new WebSocket("ws://localhost:5000/ws"); setConnection(socket); socket.onmessage = (e) => { const message = JSON.parse(e.data) console.log("message:", message) switch (message.Command) { case "loginResult": if (message.Result) { console.log("login worked"); }else{ console.log("login did not work"); } break; } }Fragmento de Go está obteniendo JSON de:
result := ws.LoginResult{ BaseMessage: ws.BaseMessage{ Command: "loginResult", }, Result: false, } b, err := json.Marshal(result) if err != nil { fmt.Println(err) return } if err = conn.WriteMessage(msgType, b); err != nil { return }Y la salida:
in here WebsocketProvider.tsx:20 message: {Command: 'loginResult', Result: false} WebsocketProvider.tsx:27 login did not work VM3502:1 Uncaught SyntaxError: Unexpected token l in JSON at position 0 at JSON.parse (<anonymous>) at WebSocket.socket.onmessage (WebsocketProvider.tsx:19) socket.onmessage @ WebsocketProvider.tsx:19¿Alguien tiene alguna idea de por qué este es el caso?
Se encontró la solución:
la función que ha escrito para onmessage se ejecutará cada vez que se reciba un mensaje websocket válido .
De acuerdo con el registro de depuración que ha publicado, la parte que funcionó fue cuando recibió JSON válido del servidor y la función se ejecutó hasta su finalización, como lo demuestra esta línea:
WebsocketProvider.tsx:27 login did not workMarque el número de línea.
Después de esto obtienes:
VM3502:1 Uncaught SyntaxError: Unexpected token l in JSON at position 0 at JSON.parse (<anonymous>) at WebSocket.socket.onmessage (WebsocketProvider.tsx:19) socket.onmessage @ WebsocketProvider.tsx:19 marque el número de línea :19 Esta es la línea con su JSON.parse .
Mi conjetura sería que este es un nuevo mensaje json no válido y de hecho entró en pánico aquí y el resto de la función no se ejecutó; el bit que se ejecutó fue un mensaje anterior con json válido .
En cuanto a por qué falló, coloque un archivo console.log antes de su JSON.parse como lo sugiere @emptyhua para ver qué está recibiendo exactamente.