Socket.io 如何发送 JavaScript 对象

Socket.io how to send JavaScript object

本文关键字:JavaScript 对象 何发送 io Socket      更新时间:2023-09-26

如何将带有Socket.io的JavaScript对象从服务器发送到客户端?我正在使用 Socket.io 作为WebSocket(与.send()一起发送并与message事件一起侦听(。当我尝试在服务器端做一些事情时:

var myObject = {
    message: 'Hello World!'
}
socket.send(myObject);

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

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

 socket.emit('yourEvent', myObject);

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

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

我只是使用一些较旧的例子遇到了这个问题。这是我找到的答案:将 0.6 迁移到 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 中编码。

socket.send()

理解对象,但它喜欢使用JSON。您可以通过以下方式使用:

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

并使用JSON.parse(json)将 JSON 解析为对象。

尝试在服务器端使用它

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

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

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

没有必要在对象上运行 JSON.stringify((,因为它会为你完成。

例如

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

有关此链接的更多信息。