没有合适的资源?快使用搜索试试~ 我知道了~
浅析Node.js的Stream模块中的Readable对象
0 下载量 117 浏览量
2021-01-02
05:57:34
上传
评论
收藏 62KB PDF 举报
温馨提示
试读
1页
我一直都很不愿意扯 nodejs 的流,因为从第一次看到它我就觉得它的设计实在是太恶心了。但是没办法,Stream 规范尚未普及,而且确实有很多东西都依赖了 nodejs 的流来实现的,所以我也只能捏着鼻子硬着头皮来扯一扯这又臭又硬的 nodejs 流对象了。 nodejs 自带了一个叫 stream 的模块,引入它便可以得到一组流对象构造器。现在我只说最简单的 stream.Readable。 其实用过 nodejs 的几乎都接触过 Readable 的实例,只是平时没太在意而已。一个非常典型的例子,http 模块中我们处理每个请求时都会有 req 和 res 对象,req 其实就是
资源详情
资源评论
资源推荐
浅析浅析Node.js的的Stream模块中的模块中的Readable对象对象
我一直都很不愿意扯 nodejs 的流,因为从第一次看到它我就觉得它的设计实在是太恶心了。但是没办法,Stream 规范尚未普
及,而且确实有很多东西都依赖了 nodejs 的流来实现的,所以我也只能捏着鼻子硬着头皮来扯一扯这又臭又硬的 nodejs 流对
象了。
nodejs 自带了一个叫 stream 的模块,引入它便可以得到一组流对象构造器。现在我只说最简单的 stream.Readable。
其实用过 nodejs 的几乎都接触过 Readable 的实例,只是平时没太在意而已。一个非常典型的例子,http 模块中我们处
理每个请求时都会有 req 和 res 对象,req 其实就是一个 Readable 对象。我们可以在这个 req 上以流的形式读到 HTTP 请求
的实体部分。
那么问题来了,为什么 http 模块要在此处以流的方式设计呢?或者从另一个维度来问这个问题就是「nodejs 如果获取
POST 请求的内容?」。懂得用搜索引擎的同学肯定可以很容易地找到这么一个答案:监听 data 事件收集数据,在 end 事件
中把收集到的数据合并起来。是的,这是解决这个问题的方法。但是为什么它如此设计呢?像 PHP 那样直接就可以取到
POST 内容多好?其实这么设计是有好处的,如果我们接收到的数据是非法的,我可以马上察觉,然后响应并断开连接。这样
可以避免一些不必要的传输成本。比如上传图片,也许用户错误地选择了一个很大的可执行文件,我们不需要等到这个文件完
全上传完毕,只要一个文件头部的若干字节就能判断一个文件是否是图片了。此处使用流的设计就可以先读出前面的几个字节
来使用。
上面提到的 data 事件和 end 事件都是 Readable 的事件,这两个事件分别表示收到数据和数据接收完毕。所以其实我们
早已知道了 Readable 的用法,只是很多人不知道它是 Readable 对象而已。
但是上面这两个事件仅仅是对 Readable 的消费者而言的事件。内部是如何把一个数据推送到 Readable 对象里面让
Readable 触发出这些事件的呢?那么它就是 push 方法。下面是一个例子,它创建了一个 Readable 对象,这个对象会流出一
个递增的数字(这里使用了 babel-node)
import stream from 'stream';
var r = new stream.Readable;
r.on('data', data => {
console.log(data + '');
});
r.on('end', data => {
console.log('end');
});
r._read = () => {
// console.log('before read');
};
void function callee(i) {
if(i < 10) {
r.push(i + ''); // 只能传入字符串或 Buffre 对象
} else {
r.push(null); // 当输入一个 null 时表示流传输完成,触发 end 事件
}
setTimeout(callee, 500, i + 1);
}(0);
如果仔细看上面代码就会发现一个很神奇的地方,这个代码覆写了 _read 方法,这是什么鬼?其实我也觉得这是个坑,
这个私有命名风格就不吐槽了,为何非要覆写这个方法才算实现它?如果没有覆写这个方法,那么在调用 push 时将抛出异
常:
Error: not implemented
at Readable._read (_stream_readable.js:464:22)
at Readable.read (_stream_readable.js:341:10)
以上这些便是 Readable 对象的基本用法。但是还有更多坑会踩到,这篇文章只是一个最简单的介绍,让大家学会如何造
出一个能输出数据的 Readable 对象而已。至于一些 read 之类的基本方法,反正这些也是不科学的设计之一。
weixin_38614812
- 粉丝: 7
- 资源: 953
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- IMG_0001.CR2.cr2
- python-3.12.3-arm64.exe
- VcXsrv软件包(运行安装了WSL(Linux子系统Linux)的Linux GUI程序)
- 微信抖音快手三合一壁纸小程序源码/后端管理设置功能丰富
- 海思平台CANN软件包
- 中华成语数据库(总共31851个成语,含拼音,解释,出处,例子)每个成语都包括拼音解释,大多数还包括出处和例子.zip
- Oracle数据库工具安装包(免安装)
- Http上传文件到服务器 php文件
- 114.0.5734.1 Google Chrome谷歌浏览器下载
- meta-llama-3-8b-instruct 的 model-00002-of-00004.safetensors 的2/3
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0