前言
stream(流)是Node.js提供的又一个仅在服务区端可用的模块,流是一种抽象的数据结构。Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出流)。
通过本文,你会知道 stream 是什么,以及 strem 在 http 服务中发挥着什么作用。
一、stream(流)是什么
1.1 举个栗子
假设楼上有一桶水,想倒往楼下的水桶。直接往下倒,肯定会洒出来,那么在两个水桶间加一根管子(pipe),就可以让楼上的水,逐渐地流到楼下的水桶内:
1.2 为什么要使用 stream
看了前面稍微了解 Node.js 的同学可能就要问了,流的作用不就是传递数据麽,也就是把一个地方数据拷贝到另一个地方,不用流也可以这样实现:
var water = fs.readFileSync('a.txt', {encoding: 'utf8'});
fs.writeFileSync('b.txt', water);
但这样做有个致命问题:
处理数据量较大的文件时不能分块处理,导致速度慢,内存容易爆满。
const rs = fs.createReadStream('a.mp4')
const ws = fs.createWriteStream('b.mp4')
rs.pipe(ws) // pipe自动调用了 data, end 等事件
1.3 小结
其实 stream 不仅可以用来处理文件,它可以处理任何一种数据提供源。下面来看看 stream 在 http 服务中,扮演着什么样的角色。
二、深入 http 模块
先来几个灵魂拷问:
- 浏览器发起 http 请求