0

The Problem

I need some help working with types in Golang, I get super confused. I am trying to alter the websocket chat example from Gorilla, and I want to pass in JSON and process it accordingly. I need to be able to set for example a user, and send a message to the websocket.

In the current implementation all it does is receive a string, and relays it back by broadcasting it to all connected clients.

For example I want to be able to set a data structure as follows and process it differently.

Incoming user would be:

{
  'type': "user",
  'value': "John Doe"
}

Incomming message would be:

{
  'type': "message",
  'value': "Hi There, how are you?"
}

Please refer to the following code: https://github.com/gorilla/websocket/blob/master/examples/chat/conn.go#L52

for {
    _, message, err := c.ws.ReadMessage()
    if err != nil {
        break
    }
    h.broadcast <- message
}

Data

So the above code works for single strings, because all the server does is pass the incoming message from any client to all. But I want to be able to save users, and send the list of active users back to the client along with the new message.

To do this, in my mind I will need to handle the different incoming messages differently. I tried to unmarchal the incomming message, but when I print out the type it's this:

2015/11/24 20:03:10 []uint8

THE QUESTION

How do I go about reading this input stream, and unmarshal it to JSON? This is the debugging I added to the section:

for {
    _, dataString, err := c.ws.ReadMessage()
    if err != nil {
        break
    }

    log.Println(reflect.TypeOf(dataString))

    var data MessageData
    err = json.Unmarshal(dataString, &data)
    log.Println(data.Type)
    log.Println(data.Value)

    if err != nil {
        log.Println(err)
    }

    h.broadcast <- dataString
}

Which Returns

2015/11/24 20:03:10 []uint8
2015/11/24 20:03:10 
2015/11/24 20:03:10 

1 Answer 1

3

Sorry, I was being a bit stupid with this. The message is already a byte type interface. I didn't properly encode the data on the HTML / JavaScript frontend before sending it to the backend.

What worked was stringifying it in the frontend:

var data = {};
data.type = "user";
data.value = user.val();
conn.send(JSON.stringify(data));
JSON.stringify(data)

Then I was able to unmarshall the JSON:

2015/11/24 20:36:04 {user fhgfhg}
2015/11/24 20:36:04 user
2015/11/24 20:36:04 fhgfhg
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.