一尘不染

在Node.js / Express中流式传输/管道JSON.stringify输出

node.js

我有一种情况,我需要从Node.js / Express RESTful API返回一个很大的对象,并将其转换为JSON字符串。

res.end(JSON.stringify(obj));

但是,这似乎无法很好地扩展。具体来说,它在连接1-2个客户端的测试机上运行良好,但我怀疑当许多客户端同时请求大型JSON对象时,此操作可能会浪费CPU和内存使用率。

我四处寻找一个异步JSON库,但是我发现的唯一一个库似乎有问题(特别是,我收到了[RangeError])。不仅如此,它还以很大的一部分返回字符串(例如,对整个字符串调用一次回调,这意味着不会减少内存占用)。

我真正想要的是JSON.stringify函数的完全异步管道/流版本,以便它在将数据直接打包到流中时写入数据…这样既节省了内存,又节省了CPU的占用。同步的方式。


阅读 570

收藏
2020-07-07

共1个答案

一尘不染

理想情况下,应按需流式处理数据,而不要将所有内容都缓冲到一个大对象中。如果您不能更改此设置,则需要将string化分成较小的单元,并允许主事件循环使用setImmediate处理其他事件。示例代码(我假设主对象具有许多顶级属性,并使用它们来分割工作):

function sendObject(obj, stream) {
    var keys = Object.keys(obj);
    function sendSubObj() {
       setImmediate(function(){
          var key = keys.shift();
          stream.write('"' + key + '":' + JSON.stringify(obj[key]));
          if (keys.length > 0) {
            stream.write(',');
            sendSubObj();
          } else {
            stream.write('}');
          }
       });
    })
    stream.write('{');
    sendSubObj();
}
2020-07-07