Javascript 如何通过socket.io将节点js后端上的集合发送到前端?
从节点js后端发送到前端时,似乎正在将转换为空对象。为什么会这样?这是JSON的限制、套接字中的bug还是节点js中的bug 在前端,我只是做了一些类似socket.On'room',data=>console.logdata 在我的节点服务器中,我尝试了以下方法:Javascript 如何通过socket.io将节点js后端上的集合发送到前端?,javascript,json,node.js,ecmascript-6,socket.io,Javascript,Json,Node.js,Ecmascript 6,Socket.io,从节点js后端发送到前端时,似乎正在将转换为空对象。为什么会这样?这是JSON的限制、套接字中的bug还是节点js中的bug 在前端,我只是做了一些类似socket.On'room',data=>console.logdata 在我的节点服务器中,我尝试了以下方法: const set = new Set; set.add("Test"); console.log(set); // outputs as: Set { 'Test' } mySocketIoNameSpace.emit('room
const set = new Set;
set.add("Test");
console.log(set); // outputs as: Set { 'Test' }
mySocketIoNameSpace.emit('room', set); // ends up on the front end as an empty object {}
…这是行不通的。鉴于此方法效果良好:
const arr = new Array();
arr.push("Test");
mySocketIoNameSpace.emit('room', arr); // front end gets: ["Test"]
const obj = new Object();
obj["Test"] = true;
mySocketIoNameSpace.emit('room', obj); // front end gets: {Test: true}
我想我必须发出类似Array.fromset的东西,或者只使用数组或对象而不是集合,这似乎很不幸,因为这会降低集合的速度或唯一性。Node.js发送JSON。如果将集合转换为JSON,它会忽略它的值,因为它们不会存储为属性。因此,您可以将其转换为数组,也可以使用如下内容:
function Set_toJSON(key, value) {
if (typeof value === 'object' && value instanceof Set) {
return [...value];
}
return value;
}
@tanguy_kNode.js中的代码片段发送一个JSON。如果将集合转换为JSON,它会忽略它的值,因为它们不会存储为属性。因此,您可以将其转换为数组,也可以使用如下内容:
function Set_toJSON(key, value) {
if (typeof value === 'object' && value instanceof Set) {
return [...value];
}
return value;
}
@tanguy_k将对象从服务器发送到客户端的代码片段通常是通过JSON完成的,如果传递任何类型的对象,socket.io的.emit将尝试这样做 但是,JSON无法表示集合对象或任何其他较新的Javascript集合对象,如Map、WeakMap等 幸运的是,集合实际上只是键的平面集合,可以直接表示为数组。收件人可以自己将其用作数组,也可以在收到时将其转换为集合 因此,要将其作为数组发送,可以执行以下操作:
mySocketIoNameSpace.emit('room', [...set]);
收件人可以将其转换为如下集合:
socket.on('room', function(data) {
if (Array.isArray(data)) {
data = new Set(data);
}
});
您第一次尝试的原因:
mySocketIoNameSpace.emit('room', set);
之所以不起作用,是因为socket.io只是将set变量直接传递给一个JSON转换器,而对set对象没有特殊了解的JSON转换器只是将其视为一个常规Javascript对象,没有可枚举属性,因此除了一个空对象之外,它没有任何东西可以放入JSON中。如果要列出集合对象的可枚举属性,则找不到任何属性。从服务器向客户端发送对象通常是通过JSON完成的,如果传递任何类型的对象,socket.io的.emit将尝试这样做 但是,JSON无法表示集合对象或任何其他较新的Javascript集合对象,如Map、WeakMap等 幸运的是,数组只能直接表示为一组平面键。收件人可以自己将其用作数组,也可以在收到时将其转换为集合 因此,要将其作为数组发送,可以执行以下操作:
mySocketIoNameSpace.emit('room', [...set]);
收件人可以将其转换为如下集合:
socket.on('room', function(data) {
if (Array.isArray(data)) {
data = new Set(data);
}
});
您第一次尝试的原因:
mySocketIoNameSpace.emit('room', set);
之所以不起作用,是因为socket.io只是将set变量直接传递给一个JSON转换器,而对set对象没有特殊了解的JSON转换器只是将其视为一个常规Javascript对象,没有可枚举属性,因此除了一个空对象之外,它没有任何东西可以放入JSON中。如果要列出集合对象的可枚举属性,则找不到任何属性。您必须发送一个数组,然后将其转换回集合JSON无法表示集合、弱集、映射或弱映射,因此在使用这些类型的变量构造JSON字符串时,它会将其转换为对象。您必须发送一个数组,然后将其转换回SetJSON无法表示集合、WeakSet、Map或WeakMap,因此当使用这些类型的变量构造JSON字符串时,它会将它们转换为对象+1个answer@yourFather-考虑到您的用户名,我很惊讶您没有以介绍开头:卢克,我是您的父亲。或者只是简单地使用mySocketIoNameSpace.emit'room',[…set]+1个answer@yourFather-考虑到你的用户名,我很惊讶你没有以介绍开始:卢克,我是你父亲。所以短消息主要是由于JSON,但也由于JSON转换器。在我看来,智能ES6 JSON转换器会将集合转换为数组而不是对象。@Luke-嗯,这是因为在JSON格式中没有较新ES6集合的精确表示。JSON是它自己的规范,独立于Javascript。是的,看起来用JSON将集合表示为数组是很自然的,但在当前的JSON格式中,在另一端解析数组时,收件人无法知道数组应该是一个集合,因此您必须在自己的代码两端添加一点smarts才能做到这一点。因此,短消息主要是由于JSON,但也由于JSON转换器。在我看来,一个智能的ES6 JSON转换器将把一个集合转换成一个数组,而不是一个对象。@Luke-嗯,这是因为没有精确的表示 以JSON格式更新ES6集合的更新。JSON是它自己的规范,独立于Javascript。是的,用JSON将一个集合表示为一个数组似乎是很自然的,但在当前的JSON格式中,当在另一端解析该数组时,接收方无法知道该数组应该是一个集合,因此您必须在自己的代码的两端添加一点智能才能做到这一点。