2012-05-04 75 views
1

我有一個網頁建立與node.js服務器的通信。我發送它的對象,並讓它返回它收到的同一個對象。但是,返回的對象是不同的 - 它的所有方法都消失了。當我發送一個JS對象到一個Node.js服務器並要求返回相同的對象時,服務器發送一個修改後的對象

這是代碼,顯示我在做什麼。我送的事件和對象:

editor.getSession().on('change', function(event) { 
    socket.emit('modificarCodigo', event); 
}); 

我回到它像這樣:

socket.on('modificarCodigo', function(data) { 
    socket.broadcast.to(socket.grupo).emit('actualizarCodigo', data); 
}); 

我怎樣才能得到node.js返回我發送給它的完整的對象,而不是修改呢?我猜測我現在看到的行爲是通過設計的 - 如果那是真的,我該如何改變它?

回答

3

您不能將函數序列化爲JSON。如果你真的需要發送功能,那麼你必須.toString()他們,發送它們,然後evalnew Function他們回到現實,但這是一個冒險的命題......爲什麼你需要發送方法?

編輯:的OP添加的評價是什麼,他正在試圖做的是傳球和王牌編輯Range對象通過電線......我想你會更好只發送到建立一個新的範圍所需要的數據目的。所以只需發送startRow,startCol,endRow和endCol,然後在另一端可以執行新的Range(data.startRow,data.startCol,data.endRow,data.endCol)。

作爲一個方面說明,可以使用toJSON方法處理對象的正確序列化(如果您的js引擎支持JSON.stringify/parse)。這裏有一個例子:

function Dude(name, age) { 
    this.name = name; 
    this.age = age; 
} 
Dude.prototype = { 
    speak: function() { alert('My name is ' + this.name); }, 
    toJSON: function() { 
     return { 
      type: 'Dude', 
      props: { name: this.name, age: this.age } 
     }; 
    } 
}; 

http.get('http://getadude.com', function(json) { 
    var data = JSON.parse(data); 

    if(type === 'Dude') data = new Dude(data.props.name, data.props.age); 
}) 
+0

我使用ace編輯器,我需要刪除一個段,所以我需要發送要刪除的段。這段由Range對象表示,我必須有'isEmpty()'方法,以便ace的'remove'方法可以工作。 –

+1

我認爲只發送構建新Range對象所需的數據會更好。因此,只需發送startRow,startCol,endRow和endCol,然後在另一端可以執行'新Range(data.startRow,data.startCol,data.endRow,data.endCol)' – Prestaul

+0

@Andrés,我更新了你的答案。 – Prestaul

1

將對象序列化爲JSON,然後再發送並解碼。它應該工作。

+0

我錯過了它不是一個屬性丟失的東西,這是一種方法。 –

相關問題