如何将Socket.io
的JavaScript对象从服务器发送到客户端?我使用Socket.io作为WebSocket(使用.send()
发送并使用message
事件监听)。
当我尝试在服务器端执行某些操作时:
var myObject = {
message: 'Hello World!'
}
socket.send(myObject);
在客户端我只得到这个字符串:[object Object]
答案 0 :(得分:41)
您实际上需要发出一个事件:
socket.emit('yourEvent', myObject);
如果使用.send()
,则只需发送对象的字符串表示形式,即发生问题的位置。请注意,您可以使用.send()
,但您必须先对对象进行JSON编码,然后在接收时对其进行解码。
除非您有特殊原因,否则最好使用标准的Socket.IO .emit()
方法,因为它会为您完成所有这些操作。这就是它的用途。
答案 1 :(得分:10)
我刚刚使用一些旧例子遇到了这个问题。以下是我找到的答案: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编码。
答案 2 :(得分:5)
socket.send()
并不了解对象,但它喜欢使用JSON。你可以这样使用:
socket.send(JSON.stringify(myObject));
并使用JSON.parse(json)
将JSON解析为Object。
答案 3 :(得分:4)
尝试在服务器端使用此功能
socket.json.send({ your : 'data' });
以及客户端的JSON.parse()
方法。
答案 4 :(得分:1)
在socket.io V4.x中,不需要使用JSON.stringify()
:
无需在对象上运行 JSON.stringify(),因为它会为您完成。
例如
// BAD
socket.emit("hello", JSON.stringify({ name: "John" }));
// GOOD
socket.emit("hello", { name: "John" });
有关此 link 的更多信息。