资讯专栏INFORMATION COLUMN

NPM酷库:through 快速创建双向流

DTeam / 2427人阅读

摘要:流做下载等功能时候,我们经常会使用数据流模块,因为,在大文件下载场景下,如果使用接口将文件全部读入内存然后再返回给客户端,很容易撑爆内存,比如一个文件,同时有人在下载,那么服务就需要占用内存。

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酷库:split 按行读取文本

    摘要:酷库,每天两分钟,了解一个流行库。昨天,我们了解的中数据流的处理,并使用快速创建双向流,今天,我们继续讨论数据流。我们昨天说到,使用数据流,可以分批读取数据到内存,而不用将文件一次性读取到内存。 NPM酷库,每天两分钟,了解一个流行NPM库。 昨天,我们了解的Node.js中数据流的处理,并使用through快速创建双向流,今天,我们继续讨论数据流。 我们昨天说到,使用数据流,可以分批...

    骞讳护 评论0 收藏0
  • NPM酷库052:sax,按解析XML

    摘要:酷库,每天两分钟,了解一个流行库。在酷库中,我们学习了如何使用库将格式文档字符串解析为的对象数据,本期,我们继续学习,一个可以以流编程的方式解析。 NPM酷库,每天两分钟,了解一个流行NPM库。· 在NPM酷库051中,我们学习了如何使用xml2js库将XML格式文档字符串解析为JavaScript的对象数据,本期,我们继续学习sax,一个可以以流编程的方式解析XML。 使用流编程的方...

    pinecone 评论0 收藏0
  • NPM酷库052:sax,按解析XML

    摘要:酷库,每天两分钟,了解一个流行库。在酷库中,我们学习了如何使用库将格式文档字符串解析为的对象数据,本期,我们继续学习,一个可以以流编程的方式解析。 NPM酷库,每天两分钟,了解一个流行NPM库。· 在NPM酷库051中,我们学习了如何使用xml2js库将XML格式文档字符串解析为JavaScript的对象数据,本期,我们继续学习sax,一个可以以流编程的方式解析XML。 使用流编程的方...

    zhangke3016 评论0 收藏0
  • NPM酷库050:xmlbuilder,创建XML文件

    摘要:酷库,每天两分钟,了解一个流行库。在前几期酷库中,我们介绍了操作等数据格式文件,在外部系统接口中,我们还会经常遇到格式的接口协议。本期,我们先来了解,用来创建格式文档。 NPM酷库,每天两分钟,了解一个流行NPM库。· 在前几期NPM酷库中,我们介绍了Node.js操作JSON5、YAML、CSON、CSV等数据格式文件,在外部系统接口中,我们还会经常遇到XML格式的接口协议。从本期开...

    baukh789 评论0 收藏0
  • NPM酷库050:xmlbuilder,创建XML文件

    摘要:酷库,每天两分钟,了解一个流行库。在前几期酷库中,我们介绍了操作等数据格式文件,在外部系统接口中,我们还会经常遇到格式的接口协议。本期,我们先来了解,用来创建格式文档。 NPM酷库,每天两分钟,了解一个流行NPM库。· 在前几期NPM酷库中,我们介绍了Node.js操作JSON5、YAML、CSON、CSV等数据格式文件,在外部系统接口中,我们还会经常遇到XML格式的接口协议。从本期开...

    taoszu 评论0 收藏0

发表评论

0条评论

DTeam

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<