当我将一个JS对象发送到Node.js服务器并要求返回相同的对象时,服务器会发回一个修改过的对象

时间:2012-05-04 14:55:10

标签: javascript json node.js socket.io

我有一个网页,可以与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 个答案:

答案 0 :(得分:3)

您无法将函数序列化为JSON。如果你真的需要发送函数,那么你必须.toString()发送它们,发送它们,然后evalnew 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