1

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完整地返回我发送给它的对象而不是修改它?我猜我现在看到的行为是设计使然 - 如果这是真的,我该如何改变它?

4

3 回答 3

3

您不能将函数序列化为 JSON。如果你真的需要发送函数,那么你必须给.toString()它们,发送它们,然后eval或者new Function它们恢复存在,但这是一个冒险的提议......为什么你需要发送方法?

编辑: OP 添加了一条评论,他试图做的是通过网络传递和 Ace 编辑器Range对象......我认为你最好只发送构建新 Range 对象所需的数据。所以只需发送 startRow、startCol、endRow 和 endCol,然后在线路的另一端您可以执行 new 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);
})
于 2012-05-04T15:16:45.230 回答
1

在发送之前将您的对象序列化为 JSON,然后对其进行解码。它应该工作。

于 2012-05-04T14:58:49.720 回答
1

听起来你真的想要 RPC,对于哪个节点有一个很棒的库,叫做 dnode。 https://github.com/substack/dnode

于 2012-05-04T16:29:58.240 回答