2012-02-28 20 views
1

我正在使用KinectJS創建一個Kinect.Rect對象。我試圖將這個對象從客戶端傳遞到服務器。在客戶端(只是在控制檯作爲參數傳遞的對象的輸出之前:爲什麼通過函數將KinectJS對象從客戶端傳遞給NodeJS會導致類丟失?

box_284 
Kinetic.Rect 
alpha: 1 
centerOffset: Object 
className: "Shape" 
drag: Object 
drawFunc: function(){ 
eventListeners: Object 
fill: "00D2FF" 
height: 25 
isListening: true 
name: undefined 
rotation: 0 
scale: Object 
stroke: "black" 
strokeWidth: 4 
visible: true 
width: 25 
x: 100 
y: 100 
__proto__: Object 

後發送是:

box 
Object 
alpha: 1 
centerOffset: Object 
className: "Shape" 
drag: Object 
eventListeners: Object 
fill: "00D2FF" 
height: 25 
isListening: true 
rotation: 0 
scale: Object 
stroke: "black" 
strokeWidth: 4 
visible: true 
width: 25 
x: 100 
y: 100 
__proto__: Object 

的KinectJS庫提供給客戶,這是一個「深度克隆」問題以及對象如何通過?是否存在服務器不可用的問題?不知道該怎麼想這個..對於Javascript來說是相當新穎的。 ==========

更新

我送參數如下:

socket.emit('add_box', eval("box_" + id)); 

凡客體是一樣的東西:box_523

+0

如何發送它? JSON序列化不包含類信息。 – Bergi 2012-02-28 19:45:55

+0

我用這個信息更新了我的問題..也許有另一種方法,我應該試圖做到這一點? – Inc1982 2012-02-28 19:51:49

回答

1

首先,我建議你有你的對象,通過訪問數組或某種字典而不是使用eval("box_" + id)。如果不考慮任何潛在的安全問題,索引到數組將會給您帶來比eval更好的性能。

爲了解決您的問題,問題是socket.emit序列化和傳輸數據。由於drawFunc是一個函數而不是數據,它不會被傳輸。

如果你仔細想想,這是相當直接的行爲。如果通過電線移動功能,預期的行爲會是什麼?它將在哪裏執行?你會傳輸實際的JavaScript,然後在服務器上評估它嗎?

儘管這些都是您可能會回答和開發自己的解決方案的所有問題,但它不是隨處可用的任何東西。


這就是說,你可能想看看function calling with nowjs。它可能適合您的要求。但同樣,它不通過線路傳輸任何代碼:

注:代碼是永遠只能在其上創建它的一側執行, 這意味着函數體實際上沒有被轉移 從客戶端到服務器或服務器到客戶端,而在同步遠程函數調用時只有一個墊片 。這對於安全來說非常重要,因爲它意味着永遠不會執行任意代碼 在NowJS中執行

+0

感謝Rohan,你能否給我一個我可以用數組或字典來完成eval('box_'+ id)會怎麼樣的快速例子? – Inc1982 2012-03-01 13:58:38

+0

我不熟悉KinectJS,但這是一般原則。初始化一個數組,'boxes = []'。然後,每當你創建一個盒子時,請執行'boxes.push [myNewBox]'。然後,您應該可以使用例如'box [123]'來訪問任何框。 – 2012-03-01 16:28:06

相關問題