req 和 res 關(guān)于 Stream 的應(yīng)用

req

由于 req => Stream.Readable,req 會(huì)具有一些只讀流的事件和屬性。根據(jù) nodejs 官網(wǎng)上的描述,總結(jié)如下:

Stream.Readable 類

API 描述 備注
close 事件 當(dāng)流被關(guān)閉是觸發(fā) 此事件表明不會(huì)再觸發(fā)其他事件,也不會(huì)有操作發(fā)生
data 事件 當(dāng)流將數(shù)據(jù)傳遞給消費(fèi)者時(shí)觸發(fā) 如果沒有使用 Readable.setEconding() 時(shí), 數(shù)據(jù) chunk 默認(rèn)是 Buffer
end 事件 當(dāng)流中沒有數(shù)據(jù)可供消費(fèi)時(shí)觸發(fā)
error 事件 當(dāng) Readable 出錯(cuò)時(shí)觸發(fā)
pause 事件 當(dāng)調(diào)用 stream.pause()readsFlowing 為 true 時(shí)觸發(fā)
resume 事件 當(dāng)調(diào)用 stream.resume()readsFlowing 不為 true 時(shí)觸發(fā)
readable.pause() 可讀流停止觸發(fā) data 事件。 其他任何數(shù)據(jù)都會(huì)保存在內(nèi)存中
readable.pipe(Stream.Writable) 將可讀流傳遞給可寫流,返回值時(shí)可寫流 更多參考同名 API
readable.resume() 恢復(fù)暫停的流觸發(fā)data事件
readable.setEncoding(encoding) 設(shè)置 data 事件的 chunk 編碼
readable.unpipe(Stream.Writable) 移除管道中的可寫流 Stream.Writeable readable.pipe() 之后調(diào)用

以上是對 API 的簡單記錄,req 有這些事件和方法。

res

res 是網(wǎng)絡(luò)請求的返回值,它的繼承關(guān)系是 res => Stream 前面介紹了可讀流,下面簡單介紹下可寫流

stream.Writable 類

API 描述 備注
close 事件 當(dāng)流被關(guān)閉時(shí)觸發(fā) 這表明不會(huì)再有任何操作
drain 事件 如果調(diào)用 stream.write(chunk) 返回 false是會(huì)觸發(fā) 當(dāng)可以繼續(xù)對流寫入數(shù)據(jù)時(shí)觸發(fā)。這表明當(dāng)前讀取的是個(gè)大文件,而分配的內(nèi)存已經(jīng)全部占用。有一部分內(nèi)存數(shù)據(jù)釋放了,再次可以寫入數(shù)據(jù)時(shí),觸發(fā)。這對控制流的寫入,內(nèi)存控制有幫助
error 事件 當(dāng)流出錯(cuò)時(shí)觸發(fā)
pipe 事件 當(dāng)使用 writeable.pipe() 時(shí)觸發(fā) 參數(shù) src 表示的是,寫入可寫流的源頭
unpipe 事件 當(dāng)使用 writeunpipe() 時(shí)觸發(fā) 參數(shù) src 表示移除的流對象
writeable.end([chunk[,encoding[,callback]]]) 調(diào)用此方法表示可寫流結(jié)束 stream.write() 必須在此方法之前
Writable.setDefaultEnoding(encoding) 設(shè)置可寫流默認(rèn)的編碼方式
writable.writableHighWaterMark 默認(rèn)是 16kB, 當(dāng)流中傳入的數(shù)據(jù)大于這個(gè)數(shù)值時(shí),stream.write() 會(huì)返回false
writable.write(chunk[, encoding][, callback]) 向流中寫入數(shù)據(jù) 返回 boolean 值

對于流而言,一般使用的是流的實(shí)現(xiàn),像 req 和 res。在實(shí)現(xiàn)流時(shí),不同的流需要實(shí)現(xiàn)不同的方法,下面列出了一些情況

使用場景 類型 需要實(shí)現(xiàn)的方法
只讀 Readable _read
只寫 Writable _write,_writev,_final
雙工 Duplex _read,_write,_writev,_final
轉(zhuǎn)換 Transform _transform,_flush,_final

使用 Stream 時(shí),通過繼承實(shí)現(xiàn)父類的方法,可以進(jìn)一步實(shí)現(xiàn)具體功能,以 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();
    }
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 流是Node中最重要的組件和模式之一。在社區(qū)里有一句格言說:讓一切事務(wù)流動(dòng)起來。這已經(jīng)足夠來描述在Node中流...
    宮若石閱讀 673評(píng)論 0 0
  • 流的基本概念及理解 流是一種數(shù)據(jù)傳輸手段,是有順序的,有起點(diǎn)和終點(diǎn),比如你要把數(shù)據(jù)從一個(gè)地方傳到另外一個(gè)地方流非常...
    October_yang閱讀 7,842評(píng)論 3 9
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,598評(píng)論 0 6
  • 簡介 主要對stream這個(gè)概念做一個(gè)形象的描述和理解,同時(shí)介紹一下比較常用的API。主要參考了Node.js的官...
    cooody閱讀 1,286評(píng)論 0 0
  • 編譯地址:https://github.com/substack/stream-handbook譯者:jabez1...
    IT程序獅閱讀 1,366評(píng)論 0 4

友情鏈接更多精彩內(nèi)容