您现在的位置是:热点 >>正文
注释掉 on('data') 请求为什么一直挂着?― 了解 Node.js Stream 的两种模式
热点98417人已围观
简介...
这是来自「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', () => { re掉 s.end(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 =&nbsdap;this; src.on('data', ondata); function ondata(chunk) { const ret = dest.write(chunk); if (ret === false) { &tanbsp; ... src.pause(); } } ... }; 三:stream.resume() 方法
stream.resume() 将处于暂停模式的可读流,恢复触发 'data' 事件,切换为流动模式。
对一开始的示例做一个改造,先调用 strea')m.resume() 用来耗尽流中的数据,但此时没有做任何的数据处理,之后会收到 end 事件。
const http = require('http'); http.createServer((req, res) => { req.resume(); req.on('end', () => { &n 请bsp; 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 ht一直tp = 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 这种方式来读取数据,代码看起来也会更简洁,同步编码思维让人也能更好的理解。
Tags:
下一篇:椰子汁开盖之后能放多久
相关文章
标签: Qing 耿乐 青初于蓝 Blued
热点云梦级2月28日云梦级消息,27日,前Blued App创建人马保力(花名耿乐)团队新推出的社交软件Qing正式上线。上线首日,就冲上苹果App Store应用商店社交榜第五的位置,仅次于腾讯的微信和...
【热点】
阅读更多云原生 CI/CD 框架 Tekton 初体验
热点Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架。Tekton 的前身是 Knative 项目的 build-pipeline 项目,这个项目是为了给 build 模块增加 pi...
【热点】
阅读更多标签: 追觅 俞浩 裁员 融资创业
热点云梦级6月25日云梦级消息,今日网上出现一篇《置身觅内》的小作文,称自己作为追觅的前员工,亲身体验到公司从扩张到裁员的急转弯。其认为追觅不是特斯拉,俞浩也不是马斯克。时代的一粒尘埃,落在个人肩头,就是...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://www.xbiao.com/search/index?tpf&wd=百度蜘蛛池租用【tg:seogoogle987】,f20
- https://www.teamlab.art/zh-hans/?submit=百度蜘蛛池租用【tg:seogoogle987】,7Kx
- https://www.kaliastyle.com/catalogsearch/result/?q=GOOGLE百度蜘蛛池租用【tg:seogoogle987】,rM0
- https://www.takachi-enclosure.com/search?eqYB=gnI31Ou&text=百度蜘蛛池租用【tg:seogoogle987】,NOT
- https://www.remit.co.jp/ne/?s=百度蜘蛛池租用【tg:seogoogle987】,fMK
- https://www.polar-tech.com/?action=QUERY&s=百度蜘蛛池租用【tg:seogoogle987】,4hT
- https://www.nextavenue.org/?action=QUERY&s=百度蜘蛛池租用【tg:seogoogle987】,cUj
- https://www.signingsavvy.com/sentence/百度蜘蛛池租用【tg:seogoogle987】,R3B
- https://www.kelsa.co.uk/catalogsearch/result/index/?T=1686132119291&q=百度蜘蛛池租用【tg:seogoogle987】,97p
- https://www.whatsonstage.com/search?cat=64&term=百度蜘蛛池租用【tg:seogoogle987】,U62
- https://www.lneg.pt/en/?s=百度蜘蛛池租用【tg:seogoogle987】,YT4
- https://blvdseafood.com/?s=百度蜘蛛池租用【tg:seogoogle987】kSV
- https://www.navymwr.org/search/?query=百度蜘蛛池租用【tg:seogoogle987】,uxp
- https://www.pickett.co.uk/collections/vendors?q=百度蜘蛛池租用【tg:seogoogle987】,EC1
- https://www.kingston.gov.uk/site-search/results/?q=百度蜘蛛池租用【tg:seogoogle987】,8uO
- https://www.miamiopenmri.com/?action=CHECK&s=百度蜘蛛池租用【tg:seogoogle987】,P0v
- https://www.reallywildbirdfood.co.uk/store/search?q=百度蜘蛛池租用【tg:seogoogle987】,AxV
- https://www.nyif.com/catalogsearch/result/?q=百度蜘蛛池租用【tg:seogoogle987】,r9i
- https://www.stormberg.com/no/search?q=百度蜘蛛池租用【tg:seogoogle987】,24L
- https://www.paxnet.co.kr/search/jongmok?kwd=百度蜘蛛池租用【tg:seogoogle987】jBM
- https://www.realsporting.com/buscador?buscar=百度蜘蛛池租用【tg:seogoogle987】,RqR
- https://www.stonerealestate.com.au/?cat=100&s=百度蜘蛛池租用【tg:seogoogle987】,mXm
- https://www.otakuninjahero.com/en/search/百度蜘蛛池租用【tg:seogoogle987】,VO5
- https://www.jusoen.com/addreng.asp?p1=百度蜘蛛池租用【tg:seogoogle987】eyi
- https://www.l-and-b.jp/?page=1&s=百度蜘蛛池租用【tg:seogoogle987】,ofE
- https://www.sebson.de/en/search?query=百度蜘蛛池租用【tg:seogoogle987】,Doh
- https://www.nytimes.com/search?dropmab=true&query=百度蜘蛛池租用【tg:seogoogle987】,tm7
- https://www.paulaschoice.hk/zh_hant/catalogsearch/result/?q=百度蜘蛛池租用【tg:seogoogle987】,tsp
- https://www.smics.com/tc/site/search?token=百度蜘蛛池租用【tg:seogoogle987】,E5Y
- https://www.livehindustan.com/tags/百度蜘蛛池租用【tg:seogoogle987】,hzR
- https://www.lgnewsroom.com/search/百度蜘蛛池租用【tg:seogoogle987】,vlr
- https://www.universal-music.co.jp/?ID=1sIcckCTeBS8FjzCshAW9w53s8gr691o&s=百度蜘蛛池租用【tg:seogoogle987】,JRB
- https://5gaa.org/?token=6e2l7hjt2i26gzgctgwdrv7v0j6nxorq&s=百度蜘蛛池租用【tg:seogoogle987】9gD
- https://yokohama-oht.com/?action=CHECK&s=百度蜘蛛池租用【tg:seogoogle987】,wNR
- https://www.roblox.com/discover/?cat=107&Keyword=百度蜘蛛池租用【tg:seogoogle987】,9Hq
- https://www.mingwai.edu.hk/?langzh-hant&s=百度蜘蛛池租用【tg:seogoogle987】,ztH
- https://www.safetv.go.kr/base/search/view?searchWord=百度蜘蛛池租用【tg:seogoogle987】AIq
- https://www.londontheatredirect.com/search/百度蜘蛛池租用【tg:seogoogle987】,xsz
- https://www.rockngem.com/?action=CHECK&s=百度蜘蛛池租用【tg:seogoogle987】,28o
- https://www.temu.com/search_result.html?search_key=百度蜘蛛池租用【tg:seogoogle987】EPB
- https://www.thealexandrian.net/?s=百度蜘蛛池租用【tg:seogoogle987】,1SW
- https://nicolazzi.it/en/?s=百度蜘蛛池租用【tg:seogoogle987】,teE
- https://www.umc.edu/search.aspx?ID=I4gnDKRS991MFcIDDzoYze4aWSAszAm7&q=百度蜘蛛池租用【tg:seogoogle987】,jZF
- https://www.yidian51.com/taobao/百度蜘蛛池租用【tg:seogoogle987】,Yfy
- https://www.woorden.org/spreekwoord.php?woord=百度蜘蛛池租用【tg:seogoogle987】,txH
- https://www.remit.co.jp/zh/?s=百度蜘蛛池租用【tg:seogoogle987】,Xwx
- https://www.nslcleaders.org/?s=百度蜘蛛池租用【tg:seogoogle987】,sdv
- https://www.tmtpost.com/search?q=百度蜘蛛池租用【tg:seogoogle987】,q16
- https://www.teamlab.art/th/?submit=百度蜘蛛池租用【tg:seogoogle987】,jHQ
- https://www.lezhin.com/ko/tags/百度蜘蛛池租用【tg:seogoogle987】,pHm