摘要:流做下载等功能时候,我们经常会使用数据流模块,因为,在大文件下载场景下,如果使用接口将文件全部读入内存然后再返回给客户端,很容易撑爆内存,比如一个文件,同时有人在下载,那么服务就需要占用内存。
NPM酷库,每天两分钟,了解一个流行NPM库。
流做下载等功能时候,我们经常会使用数据流模块(stream),因为,在大文件下载场景下,如果使用fs.readFile()接口将文件全部读入内存然后再返回给客户端,很容易撑爆内存,比如一个文件200M,同时有100人在下载,那么服务就需要占用10G 内存。
而使用stream,我们不会将文件全部读入内存,而只是在内存中建立一个“水管”,所以内存中不会堆积过多数据:
ctx.body = fs.createReadStream("filename.ext");
上述代码中,我们使用fs.createReadStream()方法创建了一个可读流,Koa会直接读取数据流,并返回给客户端。
双向流如果一个流同时可读、可写,那么这就是一个双向流。“水管”不适合解释双向流,我们用“电话线”来解释,你说的话(写数据)对方能听见(读数据),同时,对方说话(写数据)你也能听见(读数据)。
妙用双向流在很多时候能解决很复杂的问题,比如,数据库导出场景。因为数据库里数据巨大,所以不能一下子读到Node.js内存中,我们可以创建一个只写流,从数据库逐条读出数据然后调用只写流,将数据写入磁盘,所有数据全部导出到磁盘后,再参照上文创建一个只读流,再将文件返回给客户端。但是这样存在问题的:
对磁盘大小有要求
在数据库导出到磁盘的过程中,客户端接受不到任何信息,很可能会造成浏览器超时访问
白白消耗系统性能,浪费磁盘IO
接下来我们就用双向流解决这个问题:
through使用 through 可以快速创建一个双向流,相比自己调用stream模块创建双向流,through更方便,因为through已经封装了资源回收等机制。
const through = require("through"); // ... const stream = through(); ctx.body = stream; Order.find() .cursor() .eachAsync(async(order)=>{ stream.write(order.toJSON()); }) .then(()=>{ stream.end(); });
上述代码中,首先创建了一个双向流,返回给Koa,然后以Mongoose模型举例,查询数据库,并使用查询游标(cursor)逐条向流中写数据。在流的另一端,Koa就能逐条读出数据并返回给客户端。
参考资料https://github.com/dominictar...
https://nodejs.org/api/stream...
欢迎关注公众号:梁兴臣每天了解一个NPM库,一年后成为Node.js高手
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92800.html
摘要:酷库,每天两分钟,了解一个流行库。昨天,我们了解的中数据流的处理,并使用快速创建双向流,今天,我们继续讨论数据流。我们昨天说到,使用数据流,可以分批读取数据到内存,而不用将文件一次性读取到内存。 NPM酷库,每天两分钟,了解一个流行NPM库。 昨天,我们了解的Node.js中数据流的处理,并使用through快速创建双向流,今天,我们继续讨论数据流。 我们昨天说到,使用数据流,可以分批...
摘要:酷库,每天两分钟,了解一个流行库。在酷库中,我们学习了如何使用库将格式文档字符串解析为的对象数据,本期,我们继续学习,一个可以以流编程的方式解析。 NPM酷库,每天两分钟,了解一个流行NPM库。· 在NPM酷库051中,我们学习了如何使用xml2js库将XML格式文档字符串解析为JavaScript的对象数据,本期,我们继续学习sax,一个可以以流编程的方式解析XML。 使用流编程的方...
摘要:酷库,每天两分钟,了解一个流行库。在酷库中,我们学习了如何使用库将格式文档字符串解析为的对象数据,本期,我们继续学习,一个可以以流编程的方式解析。 NPM酷库,每天两分钟,了解一个流行NPM库。· 在NPM酷库051中,我们学习了如何使用xml2js库将XML格式文档字符串解析为JavaScript的对象数据,本期,我们继续学习sax,一个可以以流编程的方式解析XML。 使用流编程的方...
摘要:酷库,每天两分钟,了解一个流行库。在前几期酷库中,我们介绍了操作等数据格式文件,在外部系统接口中,我们还会经常遇到格式的接口协议。本期,我们先来了解,用来创建格式文档。 NPM酷库,每天两分钟,了解一个流行NPM库。· 在前几期NPM酷库中,我们介绍了Node.js操作JSON5、YAML、CSON、CSV等数据格式文件,在外部系统接口中,我们还会经常遇到XML格式的接口协议。从本期开...
摘要:酷库,每天两分钟,了解一个流行库。在前几期酷库中,我们介绍了操作等数据格式文件,在外部系统接口中,我们还会经常遇到格式的接口协议。本期,我们先来了解,用来创建格式文档。 NPM酷库,每天两分钟,了解一个流行NPM库。· 在前几期NPM酷库中,我们介绍了Node.js操作JSON5、YAML、CSON、CSV等数据格式文件,在外部系统接口中,我们还会经常遇到XML格式的接口协议。从本期开...
阅读 1589·2023-04-25 20:36
阅读 2010·2021-09-02 15:11
阅读 1132·2021-08-27 13:13
阅读 2639·2019-08-30 15:52
阅读 4433·2019-08-29 17:13
阅读 981·2019-08-29 11:09
阅读 1471·2019-08-26 11:51
阅读 815·2019-08-26 10:56