39

如何将 JavaScript 对象Socket.io从服务器发送到客户端?我使用 Socket.io 作为 WebSocket(发送.send()和监听message事件)。当我试图在服务器端做类似的事情时:

var myObject = {
    message: 'Hello World!'
}

socket.send(myObject);

在客户端我只得到这个字符串:[object Object]

4

5 回答 5

65

您实际上需要发出一个事件:

 socket.emit('yourEvent', myObject);

如果您使用.send(),您只是发送对象的字符串表示,这就是问题发生的地方。请注意,您可以使用.send(),但您必须先对对象进行 JSON 编码,然后在接收时对其进行解码。

除非您有特定的原因,否则最好使用标准的 Socket.IO.emit()方法,因为它会为您完成所有这些工作。这就是它的用途。

于 2012-08-04T01:20:14.037 回答
11

我刚刚使用一些较旧的示例遇到了这个问题。这是我找到的答案:Migrating 0.6 to 0.7+,我在下面重现。


在 v0.6 中,socket.send会自动将对象转换{a: 'b'}为 JSON。您可以通过以下方式向客户端发送数据:

socket.send({a: 'b'});

虽然这很酷,但它提出了一个基本问题。JSON 不仅编码对象,还编码字符串、数字等!因此,如果您明确声明要传递 JSON,API 会更加清晰(因为编码/解码 JSON 会降低性能)。

在 v0.7 中,使用json标志:

socket.json.send({a: 'b'});

现在您还可以在浏览器和服务器之间发出和接收自定义事件:

socket.emit('my_event', {a: 'b'});

事件的参数会自动为您编码为 JSON。

于 2013-05-18T10:16:49.167 回答
8

socket.send()不理解对象,但它喜欢 JSON。你可以这样使用:

socket.send(JSON.stringify(myObject));

并用于JSON.parse(json)将 JSON 解析为 Object。

于 2012-10-16T03:32:39.223 回答
5

尝试在您的服务器端使用它

socket.json.send({ your : 'data' });

以及JSON.parse()您客户端的方法。

于 2014-04-25T17:17:47.727 回答
1

在 socket.io V4.x 中,不需要使用JSON.stringify()

无需在对象上运行 JSON.stringify(),因为它会为您完成。

例如

// BAD
socket.emit("hello", JSON.stringify({ name: "John" }));

// GOOD
socket.emit("hello", { name: "John" });

有关此链接的更多信息。

于 2021-04-06T03:13:43.227 回答