Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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
Node.js NodeJS response.send()因大字符串而崩溃_Node.js_Express - Fatal编程技术网

Node.js NodeJS response.send()因大字符串而崩溃

Node.js NodeJS response.send()因大字符串而崩溃,node.js,express,Node.js,Express,很简单,我的节点服务器由于内存不足(字符串太大)而崩溃 我正在尝试返回从猫鼬发送的非常大的数据 response.send({success: true, message: "Data Report Generated", result: <very very large array>}) response.send({success:true,消息:“数据报告已生成”,结果:}) 我已经在node命令中使用--max_old_space_size=14000标志为节点服务器分

很简单,我的节点服务器由于内存不足(字符串太大)而崩溃

我正在尝试返回从猫鼬发送的非常大的数据

 response.send({success: true, message: "Data Report Generated", result: <very very large array>})
response.send({success:true,消息:“数据报告已生成”,结果:})
我已经在node命令中使用--max_old_space_size=14000标志为节点服务器分配了14GB内存,我不想添加更多内存


我别无选择,需要一个解决方案

解决这个问题有很多可能性。您没有向我们提供有关数据或应用程序的任何详细信息,因此我们只能提供一般建议:

  • 以较小的片段收集数据并将其流式传输到客户端,而不是一次将其全部累积到内存中,然后尝试一次将大量数组
    JSON.stringify()。当每一层都在发送数据时,内存中会同时出现多个数据副本

  • 对流式响应使用内置数据库支持

  • 检查数据是如何构造的,并更改格式以大幅减小字符串化JSON的大小。例如,一个巨大的对象数组,其中每个对象都有多个属性,将对每个对象重复属性名称。有更节省空间的方法来传输数据(不是简单的JSON,比如逗号分隔的列表)

  • 确保您启用了gzip压缩(尽管您的问题可能在这之前就已经存在,这会对您有所帮助)

  • 让客户机请求包含多个请求的数据块

  • 重新思考客户机的工作方式,这样您就不必立即向客户机传输大量数据。例如,客户机可以更受需求驱动,通过ajax调用根据需要请求数据,而不是一次获取所有数据。可以通过这种方式构造大型虚拟表,在用户滚动时获取更多数据

  • 找到从发送到客户端的数据中删除内容的方法

  • 在重复的JSON属性名称中使用较短的名称


  • 如果您展示了正在发送的一部分数据,并解释了希望向客户端发送这么多数据的整个应用程序,我们也许可以帮助您改变设计,这样您就不必一次发送那么多数据,或者建议更有效的发送方式。

    而不是一次从mongoose读取所有数据,您可以使用以读取流的形式获取数据,并通过管道将数据流发送到响应,在读取所有数据后,调用response.end以完全填充请求

    const queryStream=Model.find().stream();
    queryStream.pipe(响应);
    queryStream.on('end',()=>response.end());
    
    在客户端,像往常一样发送ajax调用,一旦所有数据流传输完毕,它就会被解析

    this.http.get('http://api_endpoint')
    .订阅((数据)=>{
    // ...    
    });
    
    1)您能以任何方式分解数据吗?比如多个请求?2) 或者您可以使用Stream:为您缓冲数据吗?理想情况下不需要,因为我需要完整的数据,以便将其导出到.csv文件,并在角度前端进行操作。这很有趣,但我的前端将如何解释和等待这一切?我使用angular 7作为前端部件。您好@kjohnson编码器请查看更新的答案。