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();
}
}
}