我见过的所有其他例子并没有真正为我做好。我正在尝试使用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无法正常工作,但我收到了该对象。有人知道我怎么做吗?我感谢任何帮助。
答案 0 :(得分:2)
socket.io使用JSON.stringify()
来序列化你传递它的任何对象,而JSON.stringify()
只是将一个对象转换为普通的JSON,它不包含任何关于它是什么类型的对象或它有什么方法的信息。
当连接另一端的socket.io使用JSON.parse()
将其重新转换为对象时,您只得到一个简单的Javascript对象。因此obj instanceof ExampleObject
始终为false
。
通常的解决方法是向对象添加一个属性,该属性说明它是什么类型的对象,然后在接收端使用该属性来构造正确类型的对象或在{{{ 1}}陈述。
以下是一个例子:
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");
}
});
答案 1 :(得分:0)
Socket.io只发送普通的javascript对象
<小时/> 通过socket.io发送对象时,它们被序列化为JSON,它不保留对象的类型或对象的任何方法。它只保留对象的属性。
将自定义属性添加到ExampleObject
function ExampleObject(data){
this.data = data;
this._custom_flag = true;
}
检查
client.on('receiveObject', function (obj) {
if(obj._custom_flag){
process.stdout.write("Received example object");
}else{
process.stdout.write("Received something unknown");
}
});