在Socket.IO中发送对象

时间:2016-05-29 16:31:05

标签: node.js express 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无法正常工作,但我收到了该对象。有人知道我怎么做吗?我感谢任何帮助。

2 个答案:

答案 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");
    }
});