req 和 res 关于 Stream 的应用

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();
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容