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();
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容