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

When I send a JS object to a Node.js server and ask for the same object back, the server sends back a modified object

本文关键字:对象 服务器 修改 一个 返回 JS Node js 请求      更新时间:2023-09-26

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

不能将函数序列化为 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);
})

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

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