req
由于 req => Stream.Readable
,req 会具有一些只读流的事件和属性。根据 nodejs 官网上的描述,总结如下:
Stream.Readable 类
API | 描述 | 备注 |
---|---|---|
close 事件 | 当流被关闭是触发 | 此事件表明不会再触发其他事件,也不会有操作发生 |
data 事件 | 当流将数据传递给消费者时触发 | 如果没有使用 Readable.setEconding() 时, 数据 chunk 默认是 Buffer |
end 事件 | 当流中没有数据可供消费时触发 | |
error 事件 | 当 Readable 出错时触发 | |
pause 事件 | 当调用 stream.pause() 且 readsFlowing 为 true 时触发 |
|
resume 事件 | 当调用 stream.resume() 且 readsFlowing 不为 true 时触发 |
|
readable.pause() | 可读流停止触发 data 事件。 |
其他任何数据都会保存在内存中 |
readable.pipe(Stream.Writable) | 将可读流传递给可写流,返回值时可写流 | 更多参考同名 API |
readable.resume() | 恢复暂停的流触发data 事件 |
|
readable.setEncoding(encoding) | 设置 data 事件的 chunk 编码 |
|
readable.unpipe(Stream.Writable) | 移除管道中的可写流 Stream.Writeable
|
在 readable.pipe() 之后调用 |
以上是对 API 的简单记录,req 有这些事件和方法。
res
res 是网络请求的返回值,它的继承关系是 res => Stream
前面介绍了可读流,下面简单介绍下可写流
stream.Writable 类
API | 描述 | 备注 |
---|---|---|
close 事件 | 当流被关闭时触发 | 这表明不会再有任何操作 |
drain 事件 | 如果调用 stream.write(chunk) 返回 false是会触发 | 当可以继续对流写入数据时触发。这表明当前读取的是个大文件,而分配的内存已经全部占用。有一部分内存数据释放了,再次可以写入数据时,触发。这对控制流的写入,内存控制有帮助 |
error 事件 | 当流出错时触发 | |
pipe 事件 | 当使用 writeable.pipe() 时触发 | 参数 src 表示的是,写入可写流的源头 |
unpipe 事件 | 当使用 writeunpipe() 时触发 | 参数 src 表示移除的流对象 |
writeable.end([chunk[,encoding[,callback]]]) | 调用此方法表示可写流结束 | stream.write() 必须在此方法之前 |
Writable.setDefaultEnoding(encoding) | 设置可写流默认的编码方式 | |
writable.writableHighWaterMark | 默认是 16kB, 当流中传入的数据大于这个数值时,stream.write() 会返回false | |
writable.write(chunk[, encoding][, callback]) | 向流中写入数据 | 返回 boolean 值 |
流
对于流而言,一般使用的是流的实现,像 req 和 res。在实现流时,不同的流需要实现不同的方法,下面列出了一些情况
使用场景 | 类型 | 需要实现的方法 |
---|---|---|
只读 | Readable | _read |
只写 | Writable | _write,_writev,_final |
双工 | Duplex | _read,_write,_writev,_final |
转换 | Transform | _transform,_flush,_final |
使用 Stream 时,通过继承实现父类的方法,可以进一步实现具体功能,以 Writable 为例:
const {Writable} = require('stream')
class MyWritable extends Writable{
constructor(options) {
super(options)
// ...
}
_write(chunk, encoding, callback){
if(chunk.toString().indexOf('a') >=0) {
callback(new Error('chunk is invalid'))
} else {
callback();
}
}
}