Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过socket.io将节点js后端上的集合发送到前端?_Javascript_Json_Node.js_Ecmascript 6_Socket.io - Fatal编程技术网

Javascript 如何通过socket.io将节点js后端上的集合发送到前端?

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

从节点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', 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_k

Node.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格式中,当在另一端解析该数组时,接收方无法知道该数组应该是一个集合,因此您必须在自己的代码的两端添加一点智能才能做到这一点。