2016-05-29 95 views
0

我见过的所有其他示例并不能真正为我工作。我试图使用Socket.IO发送/接收自定义对象。举例来说,假设我有两个该对象结束在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不起作用,尽管我正在接收该对象。有人知道我能做到吗?我感谢任何帮助。

回答

1

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"); 
    }  
}); 
+0

发布_literally_相同的答案是什么? –

+1

@MedetTleukabiluly - 这不是同一个答案。它显示了如何重建原始类型的对象,如果这是完整解决方案的重要部分。而且,解释更加完整和彻底(在我看来)。堆栈溢出鼓励人们写出尽可能最好和最完整的答案。这不是一个人为了包括一个可能的简单解释而进行的比赛。发布问题的人正在寻找最好,最完整的答案。那么,你低估了我的意见,因为我的答案比你的答案更完整,并且包含了更多可能的解决方法? – jfriend00

+0

不,我不满意,因为你不鼓励已经提供答案的更多细节,并发表与逻辑上相同的答案与一些改变的话 - 这就是我如何看待这一点,如果我不正确,也使我失望,我只是试着为了帮助体力劳动和获得积分,你的回答就是我最初的想法,但保持简洁的OP –

0

Socket.io仅发送


当发送经由socket.io的对象,它们被序列化为JSON其中不保留对象或任何的对象的方法的类型JavaScript对象平原。它只保留对象的属性。

解决方法

添加自定义属性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"); 
    } 
}); 
+0

灿我做这样的事吗? http://stackoverflow.com/a/16593024/4107932 – Bug

+0

是的,但它需要检查自定义标志是否存在,以及在尝试使用它们之前是否存在数据。 – Bug

+0

当然,这是关键,你没有任何其他选择的确如此 –