龙8游戏首页 注解失踪 on('data') 乞求为什么一向挂着?— 晓畅 Node.js Stream 的两栽模式
发布日期:2021-09-11 13:41    点击次数:77

这是来自「Nodejs技术栈」交流群一位读者良朋挑的一个题目,“倘若注解失踪 req.on('data') 事件监听,end 事件就收不到了,进而永世也不会实走 res.end(),乞求会被一向挂着,为什么?”。

据新华网和自如友家公寓发布的《2020中国青年租住生活蓝皮书》显示,目前中国房屋租赁人数已超两亿人,两年后预计将达到2.4亿人。在很多年轻人步入社会的必经之路上,房租贵、二房东跑路、装修质量堪忧等问题成了他们租房的痛点。

8月26日,澎湃新闻(www.thepaper.cn)从成都市政府官网获悉,为认真落实《成都市人民政府办公厅关于加快发展保障性租赁住房的实施意见》(成办发〔2021〕80号)有关要求,着力解决新市民、青年人等群体的住房困难问题,促进实现全体人民住有所居,成都市住建局等5部门印发《关于鼓励国有企业加快发展保障性租赁住房的实施方案》(简称《实施方案》)。

记者8月26日从西藏自治区政府新闻办举行的新闻发布会了解到,自2021年9月1日起西藏将开征契税,明确契税适用税率为最低档3%。

一则条例让硬气的深圳学区房业主“蔫了”。

日前,国务院第三次全国国土调查领导小组办公室、自然资源部、国家统计局发布《第三次全国国土调查主要数据公报》,并于26日联合召开新闻发布会,通报了有关情况。

倘若你读到这边,也能够先思考下这个题目!

const http = require('http'); http.createServer((req, res) => {   let data = '';  // req.on('data', chunk => {  //  data += chunk.toString();  // });   req.on('end', () => {     res.end(data);   }); }).listen(3000); 

Node.js 的可读流对象挑供了两栽模式:起伏模式(flowing)、止息模式(paused),倘若你操纵管道 pipe() 或异步迭代能够不会关注到这个题目,在它们的内部实现中已经处理益了,倘若你是基于事件的 API 来处理流龙8游戏首页,能够会有这些疑问。

起伏模式(flowing)

起伏模式下数据自动从底层编制获取,并议定 EventEmitter 挑供的事件接口,尽能够快的挑供给行使程序。必要仔细的是一切的可读流一路先都处于止息模式,要切换为起伏模式,可议定以下几栽手段实现:

一:注册 'data' 事件

为可读流对象注册一个 'data' 事件,传入事件处理函数,会把流切换为起伏模式,在数据可用时会立即把数据块传送给注册的事件处理函数。

这也是上面的疑问,为什么注解失踪 'data' 事件,乞求就会一向被挂首。

req.on('data', chunk => {   data += chunk.toString(); }); 
二:stream.pipe() 手段

调用 pipe() 手段将数据发送到可写流。

readable.pipe(writeable) 

可读流的 pipe() 手段实现中也是注册了 'data' 事件,一面读取数据一面写入数据至可写流。能够参见笔者之前的这篇文章 Node.js Stream 模块 pipe 手段操纵与实现原理分析。

Readable.prototype.pipe = function(dest, options) {   const src = this;   src.on('data', ondata);   function ondata(chunk) {     const ret = dest.write(chunk);     if (ret === false) {       ...       src.pause();     }   }   ... }; 
三:stream.resume() 手段

stream.resume() 将处于止息模式的可读流,恢复触发 'data' 事件,切换为起伏模式。

对一路先的示例做一个改造,先调用 stream.resume() 用来耗尽流中的数据,但此时异国做任何的数据处理,之后会收到 end 事件。

const http = require('http'); http.createServer((req, res) => {   req.resume();   req.on('end', () => {     res.end('Ok!');   }); }).listen(3000); 
四:异步迭代

无需注册事件监听函数,操纵 for...await of 遍历可读流,写法上也很浅易。下例,由于用到**顶级 await 特性,**必要在 ES Modules 规范中操纵。

// app.mjs import { createServer as server } from 'http'; import { on } from 'events'; const ee = on(server().listen(3000), 'request'); for await (const [{ url }, res] of ee) {  res.end('OK!'); } 

止息模式

止息模式也是流一路先时所处的模式,该模式下会触发 'readable' 事件,外示流中有可读取的数据,吾们必要不息调用 read() 手段拉取数据,直到返回 null,外示缓冲区中的数据已被耗尽,在 read() 返回 null 后,会再次触发 'readable' 事件,外示仍有可读取的数据,倘若此时停留 read() 手段调用,同样的乞求也会被挂首。

stream.read(size) 手段从流缓冲区拉取数据,每次返回指定 size 大幼的数据,倘若不指定 size 则返回内部一切缓冲的数据。

const http = require('http'); http.createServer((req, res) => {   let data = '';   let chunk;   req.on('readable', () => {     while (null !== (chunk = req.read())) {       data += chunk.toString();     }   })   req.on('end', () => {     res.end(data);   }); }).listen(3000); 

背压题目思考??

以流的样式从可读流拉取数据到可写流,清淡**从磁盘读取数据的速度比磁盘写入的速度是快的,倘若可写流来不敷消耗数据造成数据积压(专科术语会称呼这个题目为 “背压”)会怎么样?**也是来自「Nodejs技术栈」交流群读者良朋的疑问,能够思考下,应案能够写在评论区,感有趣的关注下「Nodejs技术栈」下一次讲解。

总结

流刚最先处于止息模式,因而注解失踪 req.on('data') 事件监听,乞求才会一向挂首。在基于流的手段读取文件时,之前清淡操纵注册 'data' 事件处理函数的手段从可读流中拉取数据,现在 Node.js 声援了异步迭代,更保举你操纵 for...await of 这栽手段来读取数据,代码望首来也会更简洁,同步编码思想让人也能更益的理解。

本文转载自微信公多号「Nodejs技术栈」,能够议定以下二维码关注。转载本文请有关Nodejs技术栈公多号。

【编辑保举】龙8游戏首页

数据中央UPS电源七个故障分析 投诉数据通知你,“大数据杀熟”有哪些套路? 通信大数据走程卡休业!中国通信院:别急,还有其他手段查询 Springboot 配置文件、隐私数据脱敏实践 异日什么做事最吃香?从领英通知望“数据分析”有多主要