当前位置: 首页 > 后端技术 > Node.js

NPM酷库:通过快速创建双向流

时间:2023-04-03 19:10:25 Node.js

NPM酷库,每天两分钟了解一个流行的NPM库。在使用流进行下载等功能时,我们经常使用数据流模块(stream),因为在大文件下载的情况下,使用fs.readFile()接口很容易将文件全部读入内存然后将它们返回给客户。爆内存,比如一个文件200M,100个人同时下载,那么这个服务需要占用10G内存。而使用stream,我们不会将所有的文件都读入内存,而只是在内存中搭建一个“水管”,这样就不会在内存中堆积过多的数据:ctx.body=fs.createReadStream('filename.ext');在上面的代码中,我们使用fs.createReadStream()方法创建了一个可读流,Koa会直接读取数据流返回给客户端。双向流如果一个流既可读又可写,那么它就是一个双向流。“水管”不适合解释双向流动。我们用“电话线”来解释。你说的(写数据)对方能听到(读数据),同时对方说话(写数据)你也能听到(读数据)。双向流的神奇使用,在很多情况下可以解决非常复杂的问题,比如数据库导出的场景。因为数据库中的数据非常庞大,无法一次性全部读入到Node.js内存中。我们可以创建一个只写流,从数据库中一个一个读取数据然后调用只写流将数据写入磁盘,并将所有数据导出到磁盘。之后参照上面创建一个只读流,然后将文件返回给客户端。但是这样做有个问题:对磁盘的大小有要求。在导出数据库到磁盘的过程中,客户端收不到任何信息,可能导致浏览器超时,白白访问系统性能,浪费磁盘IO。接下来,我们使用双向Stream来解决这个问题:通过使用through可以快速创建一个双向流。through相对于调用stream模块创建双向流更方便,因为through封装了资源回收等机制。constthrough=require('through');//...conststream=through();ctx.body=stream;Order.find().cursor().eachAsync(async(order)=>{stream.write(order.toJSON());}).then(()=>{stream.end();});上面代码中,首先创建一个双向流,返回给Koa,然后以Mongoose模型为例查询数据库,使用查询游标(cursor)将数据一条一条写入流中。在stream的另一端,Koa可以一个一个的读取数据返回给客户端。参考资料https://github.com/dominictar...https://nodejs.org/api/stream...欢迎关注公众号:梁星辰每天学一个npm库,做个Node.js一年后掌握