NodeJS API使用之流

2021-08-26 08:27:15 字數 3796 閱讀 8272

stream(流)是一種在 node.js 中處理流式資料的抽象介面。

基本上所有的流都繼承了event介面。

node.js 中有四種基本的流型別:

可寫流和可讀流都會在乙個內部的緩衝器中儲存資料。快取的資料量是有限的,會有乙個閥門值。

1、可讀流

當呼叫 stream.push(chunk) 時,資料會被緩衝在可讀流中。 如果流的消費程式沒有呼叫 stream.read(),則這些資料會停留在內部佇列中,直到被消費。一旦內部的可讀緩衝的總大小達到指定的閾值時。流會暫時停止從底層資源讀取資料,直到當前緩衝的資料被消費。

怎麼樣算消費?

2、可寫流

當反覆地呼叫 writable.write(chunk) 方法時,資料會被緩衝在可寫流中。 當內部的可寫緩衝的總大小小於設定的閾值時,呼叫 writable.write() 會返回 true。 一旦內部緩衝的大小達到或超過閾值時,則會返回 false。

3、使用問題

如果讀寫速度不一致,可能會導致爆倉!

1、兩種模式

可讀流實質上運作於流動中(flowing)或已暫停(paused)兩種模式之一。

在 flowing 模式中,資料自動地從底層的系統被讀取,並通過 eventemitter 介面的事件盡可能快地被提供給應用程式。在 paused 模式中,必須顯式呼叫 stream.read() 方法來從流中讀取資料片段

2、模式切換

所有可讀流都開始於 paused 模式,可以通過以下方式切換到 flowing 模式:

可讀流可以通過以下方式切換回 paused 模式:

3、相關事件

data

'data'事件會在流將資料傳遞給消費者時觸發

close

當流或其底層資源(比如檔案描述符)被關閉時,觸發'close'事件

end

'end'事件將在流中再沒有資料可供消費時觸發

4、相關方法

push

readable.push(chunk[, encoding])

chunk | 壓入讀佇列的資料塊

encoding:編碼

當可讀流處在傳輸模式下,』data』事件觸發時,可以通過 呼叫readable.read() 方法讀出來資料,這資料是用readable.push()新增的

readable.read([size])

readable.read()方法從內部緩衝區中抽出並返回一些資料。 如果沒有可讀的資料,返回null。readable.read()方法預設資料將作為「buffer」物件返回。

readable.read()方法只應該在暫停模式下的可讀流上執行。

在流模式下,readable.read()自動呼叫直到內部緩衝區的資料完全耗盡。

readable.pause()

readable.pause() 方法將會使 flowing 模式的流停止觸發 『data』 事件, 進而切出 flowing 模式。任何可用的資料都將儲存在內部快取中。

readable.resume()

readable.resume() 方法會重新觸發 『data』 事件, 將暫停模式切換到流動模式。

readable.pipe(destination)

destination  資料寫入目標
readable.pipe() 繫結乙個 writable 到 readable 上, 將可寫流自動切換到 flowing 模式並將所有資料傳給繫結的 writable。資料流將被自動管理。這樣,即使是可讀流較快,目標可寫流也不會超負荷(overwhelmed)

參考nodejs內建模組之http模組

2、相關事件

close

當流或其底層資源(比如檔案描述符)被關閉時,觸發 『close』 事件。

drain

如果呼叫 stream.write(chunk) 方法返回 false,則在適合恢復寫入資料到流時觸發 『drain』 事件。

finish

呼叫 stream.end() 方法且緩衝資料都已經傳給底層系統之後,觸發 『finish』 事件。

3、相關方法

writable.write(chunk[, encoding][, callback])

writable.write() 方法寫入一些資料到流中,並在這些資料被完全處理之後呼叫提供的 callback。

引數說明:

writable.end([chunk][, encoding][, callback])

呼叫 writable.end() 方法表明已沒有資料要被寫入可寫流。

可選的 chunk 和 encoding 引數可以在關閉流之前立即再寫入一塊資料。 如果傳入了可選的 callback 函式,則它會做為***被新增到 『finish』 事件。

呼叫 stream.end() 之後再呼叫 stream.write() 方法會導致錯誤。

01_流_基本使用.js

const fs = require("fs")

const readstream = fs.createreadstream("./test.mp4")

const writestream = fs.createwritestream("./test2.mp4")

readstream.on

("data",(data)=>)

readstream.on

("end",()=>)

02_流_優化(防緩衝流爆倉).js

const fs = require("fs")

const readstream =fs.createreadstream("./test.mp4")

const writestream =fs.createwritestream("./test2.mp4")

readstream.on

("data",(data)=>

})readstream.on

("end",()=>)

writestream.on

("drain",()=>)

03_流_優化(管道).js

const fs = require("fs")

const readstream =fs.createreadstream("./test.mp4")

const writestream =fs.createwritestream("./test2.mp4")

readstream.pipe(writestream)

支付寶介面呼叫之流程

1.使用者系統生成訂單資訊,生成支付token,存入redis,key為token,value為orderid,可以設定乙個過期時間,使其訂單在規定時間未支付就失效 2.呼叫支付寶支付時通過token得到orderid,然後根據orderid得到訂單資訊,然後把訂單資訊封裝form以post方式提交...

KVM使用之映象

型別 file vbd vmdk qcow logical volume 映象建立 1.映象建立 qemu img create f qcow2 disk.img 5g 或者dd if dev zero of disk.img bs 1g count 5 我們的環境中使用vbd 2.rawdisk ...

git 使用之路

目錄 1.構建倉庫 2.分支命令 3.拉取和提交 4.檢視命令 5.刪除和恢復 正文 1.構建倉庫,將倉庫推到遠端上 git init git add git commit m 注釋 git remote add origin 遠端倉庫位址 git push u origin master 客戶端首...