stream/pipe道JSON.stringify Node.js / Express中的输出

我有一个场景,我需要从我的Node.js / Express RESTful API返回一个非常大的对象,转换为JSONstring。

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

但是,这看起来不是很好。 具体来说,它在我的testing机器上工作良好,有1-2个客户端连接,但是我怀疑当多个客户端同时请求大的JSON对象时,这个操作可能会消耗CPU和内存的使用。

我一直在寻找一个asynchronousJSON库,但我发现唯一一个似乎有问题(具体来说,我得到一个[RangeError])。 不仅如此,它还在一个大块中返回string(例如,callback被整个string调用一次,这意味着内存占用不会减less)。

我真正想要的是JSON.stringify函数的一个完全asynchronous的pipe道/stream式版本,因此它将数据直接打包到数据stream中写入数据,从而节省了我的内存占用空间以及消耗CPU同步的方式。

理想情况下,您应该按照您的要求stream式传输数据,而不是将所有内容都缓冲到一个大对象中。 如果你不能改变这个,那么你需要将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(); } 

这听起来像你想要Dominic Tarr的JSONStream 。 显然,有一些程序集需要把它和express结合起来。

但是,如果您正在尝试将一个对象序列化( Stringify ),那么将该工作分成块可能不能真正解决问题。 stream式传输可能会减less内存占用,但不会减less所需的“工作”总量。