如何发送非常非常大的 json 对象作为响应 - node.js with express

how to send really really large json object as response - node.js with express

我一直收到此错误 FATAL ERROR: JS Allocation failed - process out of memory,我已确定这是我将非常大的 json 对象发送到 res.json(或 JSON.stringify) 为了给你一些上下文,我基本上发送了大约 30,000 个配置文件(每个配置文件有大约 10,000 行)作为一个 json 对象

我的问题是,有没有办法发送这么大的 json 对象,或者有更好的流式传输方式(比如使用 socket.io?)

我正在使用:node v0.10.33, express@4.10.2

更新:示例代码

var app = express();

app.route('/events')
.get(function(req, res, next) {
  var configdata = [{config:<10,000 lines of config>}, ... 10,000 configs]
  res.json(configdata); // The out of memory error comes here
})

您可以尝试在命令行上使用 the --max_old_space_size flag 增加可用的内存节点。

可能有更优雅的解决方案。我的第一反应是建议将 res.json() 与 Buffer 对象一起使用,而不是尝试一次性发送整个对象,但后来我意识到无论是什么转换为 JSON 都可能想要使用整个对象无论如何,立即反对。因此,即使您正在切换到流,您也会 运行 内存不足。或者至少这是我所期望的。

经过多次尝试,我最终决定 socket.io 一次发送每个配置文件,而不是一次发送所有配置文件。这解决了导致服务器崩溃的内存不足问题。感谢您的帮助

尝试使用流。您需要的是按需生成数据的可读流。我将在这里编写简化代码:

var Readable = require('stream').Readable;
var rs = Readable();

rs._read = function () {
    // assuming 10000 lines of config fits in memory
    rs.push({config:<10,000 lines of config>);
};

rs.pipe(res);