use*_*868 3 javascript sockets node.js socket.io
我正在尝试通过socket.io传递一个javascript对象。客户端
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
Run Code Online (Sandbox Code Playgroud)
因此,这假设是将cPlane对象发送到服务器。
服务器端代码在这里
var sPlanes = {}; //stands for server Planes
socket.on("send planes", function(planes){
sPlanes = planes;
console.log(planes); //Is where I noticed the problem
});
Run Code Online (Sandbox Code Playgroud)
当我console.log(cPlanes)在客户端时,我得到了

对于想知道的人来说,它是three.js。这是正确的输出,请注意对象的类型是Plane,但是当我从服务器打印出sPlanes时(假设它等于cPlanes时),我得到了。

它可能看起来正确,但是缺少大量的属性。然后,我决定尝试将其发送回客户端,看看会得到什么。
//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);
}
});
Run Code Online (Sandbox Code Playgroud)
这就是我得到的。

请注意第一张图片和第三张图片之间的差异。我认为socket.io将我的Object转换成其他东西。但是我可能在那儿某个地方犯了一个愚蠢的错误。我是socket.io和node.js的新手,因此将不胜感激。感谢:D
通过socket.io发送对象时,它们会序列化为JSON,而JSON不会保留对象的类型或该对象的任何方法。它仅保留对象的属性。
您可以通过添加一个额外的属性来解决此问题,该属性指示对象的类型,并让接收方将JSON转换为正确的对象类型,但是您必须自己编写代码才能执行此操作。
由于通常不需要发送整个活动对象,因此您可能需要重新考虑要发送到服务器的内容,而只是从对象发送一些重要的属性,然后在服务器上获得这些属性后,便会知道它仅包含服务器所需信息的一部分。
在您的特定示例中,cPlane对象中有一堆嵌入式对象,服务器可能根本不需要它们(例如,一个renderer对象和一个camera对象),因此您确实应该仔细考虑服务器实际需要并创建哪些属性。一个仅包含这些属性并发送的通用对象。
例如,您可能想这样做:
socket.emit("send planes", {x:x, y:y, z:z, name: name});
Run Code Online (Sandbox Code Playgroud)
由于这些似乎是您为该特定对象开始的唯一属性。