Socket.io如何发送JavaScript对象

zsd*_*zsd 29 javascript json node.js socket.io

如何Socket.io从服务器向客户端发送JavaScript对象?我正在使用Socket.io作为WebSocket(发送.send()和监听message事件).当我尝试在服务器端执行某些操作时:

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

socket.send(myObject);
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*rad 45

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

 socket.emit('yourEvent', myObject);
Run Code Online (Sandbox Code Playgroud)

如果使用.send(),则只需发送对象的字符串表示形式,即发生问题的位置.请注意,您可以使用.send(),但您必须首先对对象进行JSON编码,然后在接收时对其进行解码.

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


Amr*_*mro 11

我刚刚使用一些旧的例子遇到了这个问题.以下是我找到的答案:将0.6迁移到0.7+,我将在下面重现.


在v0.6中,socket.send会自动将对象转换{a: 'b'}为JSON.您可以将数据发送给客户:

socket.send({a: 'b'});
Run Code Online (Sandbox Code Playgroud)

虽然这很酷,但却是一个根本问题.JSON不仅编码对象,还编码字符串,数字等!因此,如果您明确声明要传递JSON,则API会更清晰(因为与编码/解码JSON相关的性能损失).

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

socket.json.send({a: 'b'});
Run Code Online (Sandbox Code Playgroud)

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

socket.emit('my_event', {a: 'b'});
Run Code Online (Sandbox Code Playgroud)

事件的参数会自动以JSON编码.


小智 5

socket.send()不了解对象,但是它喜欢JSON。您可以使用这种方式:

socket.send(JSON.stringify(myObject));
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

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