gpt4 book ai didi

node.js - 在 Socket.IO 中发送对象

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:13 25 4
gpt4 key购买 nike

我见过的所有其他例子最终对我来说效果并不好。我正在尝试使用 Socket.IO 发送/接收自定义对象。例如,假设我两端都有这个对象

function ExampleObject(data){
this.data = data;
}

然后在客户端,我这样做,

socket.emit('receiveObject', new ExampleObject("whatever");

在服务器端,当我使用时

client.on('receiveObject', function (obj) {
if(obj instanceof ExampleObject){
process.stdout.write("Received example object");
}else{
process.stdout.write("Received something unknown");
}
});

问题是尽管我收到了对象,但 instanceof 不起作用。有人知道我该怎么做吗?我感谢任何帮助。

最佳答案

socket.io 使用 JSON.stringify() 序列化您传递给它的任何对象,而 JSON.stringify() 只是将对象转换为纯 JSON,其中不包含有关对象类型或对象具有哪些方法的任何信息。

当连接另一端的 socket.io 使用 JSON.parse() 将其转回对象时,您将得到一个普通的 Javascript 对象。因此 obj instanceof ExampleObject 将始终为 false

通常的解决方法是向对象添加一个属性来说明对象的类型,然后在事物的接收端使用该属性来构造正确类型的对象或在 if 语句中使用。

这是一个例子:

function ExampleObject(data){
this.data = data;
this.type = "ExampleObject";
}

socket.emit('receiveObject', new ExampleObject("whatever");

然后,在另一端:

client.on('receiveObject', function (obj) {
if(obj.type === "ExampleObject"){
process.stdout.write("Received example object");
} else {
process.stdout.write("Received something unknown");
}
});

或者,您实际上可以在接收端构造适当的对象:

function ExampleObject(data){
if (typeof data === "object" && data.type === "ExampleObject") {
// construct from plain object
Object.assign(this, data);
} else {
// construct from normal data object
this.data = data;
this.type = "ExampleObject";
}
}

client.on('receiveObject', function (obj) {
if (obj.type) {
switch(obj.type) {
case "ExampleObject":
obj = new ExampleObject(obj);
break;
case "OtherObject":
obj = new OtherObject(obj);
break;
default:
console.error("Unsupported object type: ", obj.type);
break;
}
} else {
// just plain object
}
if (obj instanceof ExampleObject){
process.stdout.write("Received example object");
} else {
process.stdout.write("Received something unknown");
}
});

关于node.js - 在 Socket.IO 中发送对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37512304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com