2016-05-29 96 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

當然,這是關鍵,你沒有任何其他選擇的確如此 –