3

I'm trying to pass a javascript object with socket.io. Client side

var cPlanes = {}; //stands for client Planes
var plane = new Plane(x, y, z, model, name); //A plane object I made filled with stuff
cPlanes[nickname] = plane; //Nickname is defined elsewhere
socket.emit("send planes", cPlanes);//socket is defined elsewhere too

So this is suppose to send the cPlane object to the server.

Server side code is here

var sPlanes = {}; //stands for server Planes
socket.on("send planes", function(planes){
    sPlanes = planes;
    console.log(planes); //Is where I noticed the problem
});

when I do console.log(cPlanes) in the client side, I get this

enter image description here

It's three.js for people who are wondering. This is the correct output, notice how the type of the object is Plane But when I print out sPlanes from the server, which is suppose to equal cPlanes, I get this.

enter image description here

It may look correct, but it's missing tons of properties. Then I decided to try and send it back to the client side and see what I will get.

//Server side
io.sockets["in"](socket.room).emit("draw planes", sPlanes);

//Client side
socket.on("draw planes", function(planes){
    cPlanes = planes;
    for(var i in cPlanes){
        console.log(cPlanes);
    }
});

this is what i get.

enter image description here

Notice the difference between the first picture and the third. I think socket.io is converting my Object to something else. But I could be making a stupid mistake somewhere in there. I'm new with socket.io and node.js, so any help will be appreciated. Thanks :D

4
  • 2
    Objects sent between client and server through socket are actually converted into and parsed from JSON, so what you see are artifacts of exactly that. Commented May 30, 2015 at 19:03
  • Oh that makes sense. So are there any ways around it or I have to change my structure completely? Commented May 30, 2015 at 19:04
  • 1
    You should be sending only the most important information. Threejs's objects would contain way too much unnecessary overhead. Like it must have functions that couldn't possibly be used serverside so why even bother sending it Commented May 30, 2015 at 19:07
  • Ok thanks. Ugh so annoying :P Commented May 30, 2015 at 19:08

2 Answers 2

7

When sending object via socket.io, they are serialized into JSON which does NOT retain the type of the object or any of the methods of the object. It only retains the properties of the object.

You can work around this by adding an extra property that indicates the type of object and having the receiving side convert the JSON into the right type of object, but you will have to write code yourself in order to do this.

Since you generally don't need to send a whole live object, you may want to rethink what you are sending to the server and just send a few important properties from the object and then when you get those properties on the server, you will know that it just has a subset of the information that is needed by the server.


In your specific example, there are a bunch of embedded objects in the cPlane object that likely are not needed by the server at all (like a renderer object and a camera object) so you really should think about exactly which properties does the server actually need and create a new generic object that contains only those properties and send that.

For example, you might want to do this:

socket.emit("send planes", {x:x, y:y, z:z, name: name});

Since these seem to be the unique properties you started with for this particular object.

Sign up to request clarification or add additional context in comments.

Comments

0

somethinf like Apache Thrift woukd help. The idea is to keep "class" definitions on both side of client and server.

What you can do is to wrap your class object.append a will-never-be-used variabke to hint the class on the client side. Then on the sever side, creat a new object of the class accordingly. And assign all the values to it.

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.