我有一个网页,可以与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
完整地返回我发送给它的对象而不是修改它?我猜想我现在看到的行为是设计的 - 如果这是真的,我怎么能改变它?
答案 0 :(得分:3)
您无法将函数序列化为JSON。如果你真的需要发送函数,那么你必须.toString()
发送它们,发送它们,然后eval
或new Function
它们重新存在,但这是一个冒险的命题......你为什么需要发送方法?
编辑: OP添加了一条评论,他正在尝试做的是传递和Ace编辑器Range
对话通过电线...我认为你最好发送只是构建新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);
})
答案 1 :(得分:1)
在发送对象之前将对象序列化为JSON,然后对其进行解码。它应该工作。
答案 2 :(得分:1)
听起来像你真正想要的RPC,哪个节点有一个很棒的库叫做dnode。 https://github.com/substack/dnode