您现在的位置是:热点 >>正文
注释掉 on('data') 请求为什么一直挂着?― 了解 Node.js Stream 的两种模式
热点5165人已围观
简介...
这是来自「Nodejs技术栈」交流群一位读者朋友提的一个问题,“如果注释掉 req.on('data') 事件监听,end 事件就收不到了,进而永远也不会执行 res.end(),请求会被一直挂着,为什么?”。
如果你读到这里,也可以先思考下这个问题!
const http = require('http'); http.createServer((req, res) => { let dat注释a = ''; // req.on('data', chunk => { // data += chunk.toString(); // }); req.on('end', () => { res.en掉 d(data); }); }).listen(3000);
Node.js 的可读流对象提供了两种模式:流动模式(flowing)、暂停模式(paused),如果你使用管道 pipe() 或异步迭代可能不会关注到这个问题,在它们的内部实现中已经处理好了,如果你是基于事件的 API 来处理流,可能会有这些疑问。
流动模式(flowing)
流动模式下数据自动从底层系统获取,并通过 EventEmitter 提供的事件接口,尽可能快的提供给应用程序。需要注意的是所有的可读流一开始都处于暂停on模式,要切换为流动模式,可通过以下几种方式实现:
一:注册 '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 = thidas; src.on('data', ondata); function ondata(chunk) { const ret = dest.write(chunk); if (ret === false) { &nbstap; ... src.pause(); } } ... }; 三:stream.resume() 方法
stream.resume() 将处于暂停模式的可读流,恢复触发 'data' 事件,切换为流动模式。
对一开始的示例做一个改造,先调用 stream.resu')me() 用来耗尽流中的数据,但此时没有做任何的数据处理,之后会收到 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'; i求为mport { 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&nbs一直p;= require('http'); http.createServer((req, res) => { let data = ''; let chunk; req.on('readable', () => { whi挂着le (null !== (chunk = req.read())) { data += chunk.toString(); } }) req.on('end', () => { &?―nbsp; res.end(data); }); }).listen(3000);
背压问题思考??
以流的形式从可读流拉取数据到可写流,通常**从磁盘读取数据的速度比磁盘写入的速度是快的,如果可写流来不及消费数据造成数据积压(专业术语会称呼这个问题为 “背压”)会怎么样?**也是来自「Nodejs技术栈」交流群读者朋友的疑问,可以思考下,答案可以写在评论区,感兴趣的关注下「Nodejs技术栈」下一次讲解。
总结
流刚开始处于暂停模式,所以注释掉 r 了eq.on('data') 事件监听,请求才会一直挂起。在基于流的方式读取文件时,之前通常使用注册 'data' 事件处理函数的方式从可读流中拉取数据,现在 Node.js 支持了异步迭代,更推荐你使用 for...await of 这种方式来读取数据,代码看起来也会更简洁,同步编码思维让人也能更好的理解。
Tags:
下一篇:联合国成立人工智能咨询小组
相关文章
标签: 哈啰单车 哈啰普惠 98后招聘 招聘年龄歧视
热点云梦级2月28日云梦级消息,据极目新闻报道,一名网友近日在社交媒体发帖称,其在招聘网站发现有岗位招聘要求“98后”,认为对年龄的限制很严苛。2月27日,涉事品牌哈啰单车客服人员回应称,涉及相关招聘信息...
【热点】
阅读更多OpenAI 首席执行官 Sam Altman 注意到 Twitter 上大量 AI 账号现象
热点近日,OpenAI 首席执行官 Sam Altman 在社交媒体上分享了他对当前网络现象的观察,他指出:“看来,现在 Twitter 上有很多由大型语言模型(LLM)驱动的账号。” 这番话引发了公众对...
【热点】
阅读更多AMD宣布斥资19亿美元收购云计算创企Pensando
热点4月5日消息,当地时间周一AMD表示,将斥资19亿美元收购云计算初创公司Pensando,籍此增强数据中心产品功能,满足云计算和企业领域不断增长的市场需求。 AMD表示,交易金额不包括运营资本和其它调...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://www.tailoy.com.pe/catalogsearch/result/?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,ViG
- https://www.wou.edu.my/?s=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,ZXu
- https://www.kaiyueleather.com/search/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,n3q
- https://www.routesonline.com/search/?query=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,OQZ
- https://www.universal-music.co.jp/search/?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,5sq
- https://www.supersauna.de/catalogsearch/result/?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,6s0
- https://www.reginatangoshoes.com/en/catalogsearch/result/index/?T=1686132113407&q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,6rR
- https://www.parl.ca/legisinfo/fr/projets-de-loi?parlsession=all&view=list&keywords=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,SHi
- https://www.teamlab.art/pt/?submit=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,eoP
- https://www.nonsolocap.it/cap?action=SEARCH&k=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,Bjk
- https://www.tmtpost.com/search?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,2Ia
- https://www.maine.gov/pfr/professionallicensing/search/node?keys=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,dzY
- https://www.universal-music.co.jp/?ID=1sIcckCTeBS8FjzCshAW9w53s8gr691o&s=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,xHS
- https://xn--lgernevedlystskoven-lxb.dk/search/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,mSC
- https://www.losgatoschamber.com/list/search?action=SEARCH&q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,big
- https://www.prattlibrary.org/search?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,ReF
- https://www.ntv.co.jp/3min/search/?action=QUERY&q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,P6w
- https://www.monroecounty.gov/search/?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,ZY5
- https://www.lifesciencesweden.se/search?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,10I
- https://www.olx.ba/pretraga?trazilica=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,Mwt
- https://www.tiktok.com/tag/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,yjd
- https://www.mexperience.com/?T=1686132112324&s=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,tmG
- https://www.tumblr.com/tagged/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,Lzu
- https://www.nss.nhs.scot/search?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,OFG
- https://www.tcv.org.uk/search/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,6bA
- https://www.symatoys.com/search.html?ID=UyMD6aO58bPrJvQAB1I0N69KzJBZeNPC&keyword=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,V0S
- https://www.vfw.org/search-results?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,qHE
- https://m.shoppinghow.kakao.com/m/search/q/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】gm7
- https://www.mi.com/search?keyword=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,S9z
- https://www.searcychamber.com/list/search?AsfnA=DtkTQzs&q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,Kns
- https://www.wellbees.com/index.php/catalogsearch/result/index/?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,1Ln
- https://www.usslexington.com/?action=QUERY&s=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,SqN
- https://www.simcoemuskokahealth.org/SearchResults.aspx?SearchQuery=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,42h
- https://www.selfsufficientish.com/main/?s=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,vhX
- https://nicolazzi.it/en/?s=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,9pC
- https://www.temu.com/search_result.html?search_key=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】v03
- https://www.ussalabama.com/?action=CHECK&s=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,hBE
- https://www.thedp.com/page/search?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,Hw0
- https://www.dba.dk/soeg/?soeg=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】tcX
- https://www.roblox.com/discover/?cat=107&Keyword=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,JdZ
- https://www.madebyoranges.com/nl/search/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,Whx
- https://www.flickr.com/photos/tags/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】QMz
- https://www.stormberg.com/no/search?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,pPG
- https://www.tombow.com/search/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,2ml
- https://www.lyrics.com/lyrics/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,UAT
- https://www.qylaws.com/search/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,LOE
- https://www.samen-maier.at/search/谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,29u
- https://www.duksung.ac.kr/search/front/Search.jsp?qt=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】p0P
- https://www.rhymezone.com/r/rhyme.cgi?typeofrhyme=oldrel&loc=nojs&Word=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,er9
- https://www.rookwinkel.nl/catalogsearch/result/index/?q=谷歌留痕技术教程-教程要点与实践【tg:seogoogle987】,37q