我正在尝试使用 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
所以这是假设将 cPlane 对象发送到服务器。
服务器端代码在这里
var sPlanes = {}; //stands for server Planes
socket.on("send planes", function(planes){
sPlanes = planes;
console.log(planes); //Is where I noticed the problem
});
当我在客户端执行 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);
}
});
这就是我得到的。
注意第一张图片和第三张图片之间的区别。我认为 socket.io 正在将我的对象转换为其他东西。但我可能在那里的某个地方犯了一个愚蠢的错误。我是 socket.io 和 node.js 的新手,所以我们将不胜感激。谢谢:D
最佳答案
当通过 socket.io 发送对象时,它们被序列化为 JSON,它不保留对象的类型或对象的任何方法。它只保留对象的属性。
您可以通过添加一个指示对象类型的额外属性并让接收方将 JSON 转换为正确的对象类型来解决此问题,但您必须自己编写代码才能执行此操作。
由于您通常不需要发送整个事件对象,您可能需要重新考虑要发送到服务器的内容,只需发送对象的一些重要属性,然后当您在服务器上获取这些属性时,您会知道它只是服务器所需信息的一个子集。
在您的具体示例中,cPlane 对象中有一堆嵌入式对象,服务器可能根本不需要这些对象(例如 renderer
对象和 camera
object) 所以你真的应该考虑服务器实际需要哪些属性并创建一个只包含这些属性的新通用对象并发送它。
例如,您可能想这样做:
socket.emit("send planes", {x:x, y:y, z:z, name: name});
因为这些似乎是您开始时针对该特定对象使用的独特属性。
关于javascript - Socket.io 传递 javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30550076/