好處 | 缺點 |
---|---|
高效加工 | 陡峭的學(xué)習(xí)曲線 |
便于使用 | 與其他 Node.js 流不兼容 |
模塊化代碼 | 調(diào)試問題 |
背壓處理 | 復(fù)雜的控制流程 |
節(jié)點流:先睹為快
?? Node Streams 是為 Node.js 應(yīng)用程序通道化和處理輸入和輸出數(shù)據(jù)的有效方式。
?? 使用 Node Js 流,企業(yè)家可以提高處理大量數(shù)據(jù)的 Node.js 應(yīng)用程序的性能、可擴(kuò)展性和可維護(hù)性。
?? 了解 Node.js 中的流類型及其實用教程,以便更好地理解。
?? 探索節(jié)點流的鏈接和管道。
什么是 Node Js 中的流?
流是用于處理可按順序讀取或?qū)懭氲臄?shù)據(jù)的抽象接口。在 Node.js 中,流是用于處理輸入和輸出源之間數(shù)據(jù)流的基本概念。
流是 Node.js 中的一個重要概念,因為它們允許高效處理大量數(shù)據(jù)。流不是一次將所有數(shù)據(jù)加載到內(nèi)存中,而是在數(shù)據(jù)可用時分塊處理數(shù)據(jù)。數(shù)據(jù)可以從源(如文件或網(wǎng)絡(luò)套接字)實時流式傳輸?shù)侥繕?biāo)(如響應(yīng)對象或另一個文件),而無需立即將整個數(shù)據(jù)緩沖到內(nèi)存中。
例如,可以從各種數(shù)據(jù)源、接收器、文件、網(wǎng)絡(luò)套接字和標(biāo)準(zhǔn)輸入/標(biāo)準(zhǔn)輸出讀取流或?qū)懭肓鳌?/span>
?? 流模塊
Node.js 中的流模塊是一個核心模塊,它提供了一種處理流數(shù)據(jù)的方法。它提供了一組用于創(chuàng)建、讀取和寫入流的 API。
?? 節(jié)點 Js 流式 API
Node.js 中的 Stream API 是一組 API,提供了一種在 Node.js 中處理流數(shù)據(jù)的方法。Stream API 提供了一組用于創(chuàng)建、讀取和寫入 Node 流的類和函數(shù)。
以下是 Node.js 中 Stream API 的主要組件:
Stream 類: Stream API 提供了幾個用于處理 Node js 流的類,包括 Readable、Writable、Duplex 和 Transform 類。這些類提供具有不同功能的不同類型的流。
Stream 方法: Stream API 提供了幾種處理流的方法,包括用于連接可讀和可寫類型的 pipe() 方法,以及用于處理數(shù)據(jù)事件或更多事件的 onData() 方法。
事件: Stream API 提供了幾個可以由流發(fā)出的事件,包括“數(shù)據(jù)”、“結(jié)束”、“錯誤”和“完成”。這些事件可用于處理流處理的不同方面。
流選項: Stream API 提供配置流的選項,例如設(shè)置可讀流的編碼或設(shè)置可寫流的高水位線。
節(jié)點流的類型
有四種不同類型的流,每一種都有特定的用途,即可讀 NodeJs 流、可寫流、雙工流和用于 Node js 應(yīng)用程序的轉(zhuǎn)換流。
讓我們了解 Readable Node Js Stream 示例。
?? 可讀流
可讀流用于從源讀取數(shù)據(jù),例如文件或網(wǎng)絡(luò)套接字。每當(dāng)新數(shù)據(jù)可用時,它們都會發(fā)出“數(shù)據(jù)”事件,并在流結(jié)束時發(fā)出“結(jié)束”事件。Node.js 中的可讀流示例包括'fs.createReadStream()'用于讀取文件和'http.IncomingMessage'用于讀取 HTTP 請求。
讓我們通過一個例子來理解 Readable Node Js Stream。
const fs = require('fs');// 從文件創(chuàng)建一個可讀流const readStream = fs.createReadStream('example.txt', { encoding: 'utf8' });// 處理流發(fā)出的“數(shù)據(jù)”事件readStream.on('數(shù)據(jù)', (塊) => {
console.log(`接收到 ${chunk.length} 字節(jié)的數(shù)據(jù)。`);});// 處理流發(fā)出的“結(jié)束”事件readStream.on('結(jié)束', () => {
console.log('到達(dá)文件末尾。');});// 處理流發(fā)出的錯誤readStream.on('錯誤', (err) => {
console.error(`錯誤:${err}`);});
輸出
在此示例中,我們使用 fs 模塊從名為'例子.txt'. 我們將編碼選項設(shè)置為'utf8'以字符串形式讀取文件。
然后我們處理流發(fā)出的“數(shù)據(jù)”事件,每次從文件中讀取一大塊數(shù)據(jù)時都會觸發(fā)該事件。在這種情況下,我們只記錄接收到的字節(jié)數(shù)。
我們也處理'結(jié)尾'流發(fā)出的事件,當(dāng)?shù)竭_(dá)文件末尾時觸發(fā)。最后,我們將流發(fā)出的任何錯誤記錄到控制臺。
準(zhǔn)備好利用 Node.js Streams 的力量了嗎?
立即聘請Node js 開發(fā)人員或與知名 Node.js 開發(fā)公司合作,將您的項目提升到一個新的水平!
?? 可寫流
可寫流用于將數(shù)據(jù)寫入目標(biāo),例如文件或網(wǎng)絡(luò)套接字。他們有個'寫()'方法來寫數(shù)據(jù)和'結(jié)尾()'表示流結(jié)束的方法。Node.js 中此流的示例包括'fs.createWriteStream()'用于寫入文件和'http.ServerResponse'用于編寫 HTTP 響應(yīng)。
NodeJs 可寫流示例:
const fs = require('fs');// 創(chuàng)建一個可寫流const writeStream = fs.createWriteStream('output.txt');// 將數(shù)據(jù)寫入文件writeStream.write('Hello from write stream')// 結(jié)束可寫流writeStream.end();// 處理流事件writeStream.on('完成', () => {
console.log(`Write Stream Finished!`);})writeStream.on('錯誤', (錯誤) => {
console.error(`Write Stream 錯誤:${error}`);})
輸出
在此示例中,我們使用 fs 模塊為名為的文件創(chuàng)建可寫流'輸出.txt'。我們將編碼選項設(shè)置為“utf8”,以字符串形式從文件中讀取數(shù)據(jù)。
然后我們使用 write() 方法將數(shù)據(jù)寫入流,調(diào)用它兩次以寫入兩行文本。我們使用 end() 方法結(jié)束流。
我們也處理'結(jié)束'流發(fā)出的事件,在所有數(shù)據(jù)都寫入文件時觸發(fā)。最后,我們將流發(fā)出的任何錯誤記錄到控制臺。
??雙工流
雙工流是雙向的,這意味著它們可以讀取和寫入數(shù)據(jù)。它們可用于將數(shù)據(jù)從一個網(wǎng)絡(luò)套接字代理到另一個網(wǎng)絡(luò)套接字等任務(wù)。雙工流繼承自兩者'可讀'和'可寫'流,因此它們具有兩者的所有方法。
雙工流示例:
const { Duplex } = require('stream');const myDuplex = new Duplex({
寫(塊,編碼,回調(diào)){
console.log(chunk.toString());
打回來();
},
閱讀(大?。﹞
如果 (this.currentCharCode > 90) {
這個。推(空);
返回;
}
this.push(String.fromCharCode(this.currentCharCode++));
}});myDuplex.currentCharCode = 65;process.stdin.pipe(myDuplex).pipe(process.stdout);
在此示例中,我們使用流模塊中的 Duplex 類創(chuàng)建一個新的 Duplex 流。每當(dāng)數(shù)據(jù)寫入流時都會調(diào)用 write 方法,并將數(shù)據(jù)塊簡單地記錄到控制臺。每當(dāng)從流中讀取時都會調(diào)用 read 方法,在本例中,它將字符從 ASCII 字符集中推送到流中,直到字符代碼達(dá)到 90,此時它推送 null 以表示流結(jié)束。
然后我們通過管道傳輸標(biāo)準(zhǔn)輸入流(過程.stdin)到我們的 Duplex 流,然后將 Duplex 流通過管道傳輸?shù)綐?biāo)準(zhǔn)輸出流(過程.stdout)。這允許我們在控制臺中鍵入輸入,它被寫入雙工流,然后雙工流的輸出被寫入控制臺。
?? 轉(zhuǎn)換流
轉(zhuǎn)換流是一種雙工流,可以在數(shù)據(jù)通過它們時修改數(shù)據(jù)。它們可用于壓縮、加密或數(shù)據(jù)驗證任務(wù)。轉(zhuǎn)換流繼承自'復(fù)式',所以他們都有'讀()'和一個'寫()'方法。當(dāng)您將數(shù)據(jù)寫入轉(zhuǎn)換流時,它會在作為輸出發(fā)出之前由轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換。
讓我們看一個轉(zhuǎn)換 Node.js 流的例子。
const fs = require('fs');// 導(dǎo)入 strema APIconst { Transform, pipeline } = require('stream');// 創(chuàng)建可讀流const readableStream = fs.createReadStream('input.txt');// 創(chuàng)建一個可寫流const writableStream = fs.createWriteStream('output.txt');// 設(shè)置編碼為utf8。readableStream.setEncoding('utf8');// 將 chunk 轉(zhuǎn)換為大寫const uppercaseWordProcessing = new Transform({
轉(zhuǎn)換(塊,編碼,回調(diào)){
console.log(`要轉(zhuǎn)換的數(shù)據(jù):${chunk}`);
回調(diào)(null, chunk.toString().toUpperCase());
}});可讀流
.pipe(大寫文字處理)
.pipe(可寫流)// 或者,我們可以使用管道 API 輕松地通過管道傳輸一系列流//一起并在管道完全完成時得到通知。管道(readableStream,uppercaseWordProcessing,writableStream,(錯誤)=> {
如果(錯誤){
console.error(`轉(zhuǎn)換流時發(fā)生錯誤:${error}`);
} 別的 {
console.log('流水線成功!');
}});// 處理流事件readableStream.on('結(jié)束', () => {
console.log(`Read Stream Ended!`);
writableStream.end();})readableStream.on('error', (error) => {
console.error(`Read Stream Ended with an error: ${error}`);})writableStream.on('完成', () => {
console.log(`Write Stream Finished!`);})writableStream.on('錯誤', (error) => {
console.error(`Write Stream 錯誤:${error}`);})
輸出
在這個例子中,我們創(chuàng)建了一個名為'大寫轉(zhuǎn)換'擴(kuò)展內(nèi)置'轉(zhuǎn)換'班級從'溪流'模塊。我們重寫“_transform”方法,使用'toUpperCase'字符串對象的方法。然后,我們使用'推'方法并調(diào)用'打回來'函數(shù)來表明我們已經(jīng)完成了塊的處理。
最后,我們通過管道'標(biāo)準(zhǔn)輸入'可讀流到我們的實例中'大寫轉(zhuǎn)換'類,并將生成的轉(zhuǎn)換后的數(shù)據(jù)傳輸?shù)?/span>'標(biāo)準(zhǔn)輸出'可寫流 這會導(dǎo)致所有數(shù)據(jù)寫入'標(biāo)準(zhǔn)輸入'轉(zhuǎn)換為大寫并打印到控制臺。
現(xiàn)在我們了解了 Nodejs Streams 的類型,讓我們了解使用它們的商業(yè)利益。
Node Js Streaming 的優(yōu)勢
使用 Node.js 并擁有大量數(shù)據(jù)的熱門公司(例如 Netflix、NASA、Uber、沃爾瑪?shù)龋┱诶?Node.js 流,因此能夠更好地管理、維持和執(zhí)行他們的應(yīng)用程序。以下是在 Node.js 應(yīng)用程序中使用 Node Streams 的優(yōu)勢。
內(nèi)存效率: Streams 可以處理大量數(shù)據(jù),而無需同時將所有數(shù)據(jù)都存入內(nèi)存。這意味著流可以處理太大而無法放入內(nèi)存的文件和數(shù)據(jù)。
性能:因為流可以分塊處理數(shù)據(jù),所以它們比同時讀取或?qū)懭胝麄€數(shù)據(jù)集的其他方法更快、更高效。這對于需要低延遲和高吞吐量的實時應(yīng)用程序特別有用。
靈活性: Streams 可用于處理范圍廣泛的數(shù)據(jù)源和目標(biāo),包括文件、網(wǎng)絡(luò)套接字以及 HTTP 請求和響應(yīng)。這使得流成為在不同上下文中處理數(shù)據(jù)的多功能工具。
模塊化:節(jié)點流可以很容易地組合和管道化,允許將復(fù)雜的數(shù)據(jù)處理任務(wù)分解成更小、更易于管理的部分。這可以使代碼更易于閱讀和維護(hù)。
背壓處理:當(dāng)數(shù)據(jù)目的地?zé)o法跟上時,Streams 可以通過自動降低數(shù)據(jù)源的速度來處理背壓。這有助于防止緩沖區(qū)溢出和其他性能問題。
總體而言,在 Node.js 中使用流有助于提高處理大量數(shù)據(jù)的應(yīng)用程序的性能、可擴(kuò)展性和可維護(hù)性。
是時候進(jìn)一步了解實現(xiàn) Node 流的潛力和范圍,以及 Node Js Streams 的用例了。
節(jié)點流中的管道
在 Node Js Streaming 中,管道是一種使用 pipe() 方法將可讀流與可寫流連接起來的方法。pipe() 方法將可寫流作為參數(shù)并將其連接到可讀流。
當(dāng)調(diào)用 pipe() 時,它會在可讀流的“數(shù)據(jù)”和“結(jié)束”事件上設(shè)置監(jiān)聽器,并自動將數(shù)據(jù)從可讀流寫入可寫流,直到到達(dá)可讀流的末尾。這使得將多個流鏈接在一起并創(chuàng)建用于處理數(shù)據(jù)的管道變得容易。
這是使用 pipe() 方法的示例:
const fs = require('fs');// 從文件創(chuàng)建一個可讀流const readStream = fs.createReadStream('input.txt');// 創(chuàng)建文件的可寫流const writeStream = fs.createWriteStream('output.txt');// 將可讀流通過管道傳遞給可寫流readStream.pipe(writeStream);// 處理任一流發(fā)出的錯誤readStream.on('錯誤', (err) => {
console.error(`讀取文件時出錯:${err}`);});writeStream.on('錯誤', (err) => {
console.error(`寫入文件時出錯:${err}`);});
在這個例子中,我們首先使用 fs 模塊創(chuàng)建可讀可寫類型的流。然后,我們再使用 pipe() 方法將可讀流連接到可寫流。
我們還使用 on('error') 方法處理任一流發(fā)出的任何錯誤。
請注意,pipe() 是 Node.js 中處理流數(shù)據(jù)流的一種便捷方式,但它可能并不總是適用于復(fù)雜的流處理場景。此外,發(fā)現(xiàn)各種調(diào)試技術(shù)和工具可以幫助您快速識別和修復(fù)Debug Node JS 應(yīng)用程序的問題。
管道節(jié)點流的優(yōu)缺點
讓我們開始回答這個問題,什么是節(jié)點流鏈接?
節(jié)點 Js 流鏈接
在 Node Streams 中,鏈接是一種使用方法鏈接將多個流操作連接在一起的方法。鏈接允許您輕松創(chuàng)建可應(yīng)用于可讀流的流操作管道,在數(shù)據(jù)流經(jīng)管道時轉(zhuǎn)換或處理數(shù)據(jù)。
要將流操作鏈接在一起,您只需在可讀流上調(diào)用方法,它會返回可以進(jìn)一步操作或連接到其他節(jié)點流的新流對象。當(dāng)數(shù)據(jù)流經(jīng)管道時,將按順序應(yīng)用生成的流操作。
下面是使用鏈接創(chuàng)建流操作管道的示例:
const fs = require('fs');// 從文件創(chuàng)建一個可讀流const readStream = fs.createReadStream('input.txt');// 鏈?zhǔn)搅鞑僮鱽磙D(zhuǎn)換數(shù)據(jù)讀流
.pipe(transformStream1)
.pipe(transformStream2)
.pipe(transformStream3)
.pipe(writeStream);// 創(chuàng)建文件的可寫流const writeStream = fs.createWriteStream('output.txt');// 定義轉(zhuǎn)換流操作const transformStream1 = // ...const transformStream2 = // ...const transformStream3 = // ...
在這個節(jié)點流示例中,我們使用 fs 模塊從文件創(chuàng)建一個可讀流。然后我們結(jié)合幾個流操作來轉(zhuǎn)換數(shù)據(jù),使用 pipe() 方法將每個操作連接到下一個操作。
我們分別定義各個轉(zhuǎn)換流操作,并將它們作為參數(shù)傳遞給 pipe()。這些操作可以是任何流類型,包括 Transform、Duplex,甚至其他可讀流。
最后,我們創(chuàng)建一個文件的可寫流,并使用 pipe() 將其連接到管道的末端。
請注意,鏈接是在 Node.js 中處理流數(shù)據(jù)的一種強(qiáng)大方式,但它有時可能只是最有效或最靈活的方法。此外,了解如何為您的項目利用新版本的 Node.js。按照簡單的步驟下載并安裝最新版本的 Node 19和更新。
節(jié)點鏈接的優(yōu)點和缺點
好處 | 缺點 |
---|---|
靈活加工 | 復(fù)雜的 |
可重用性 | 陡峭的學(xué)習(xí)曲線 |
提高性能 | 兼容性有限 |
調(diào)試方便 | 控制流問題 |
關(guān)鍵要點
使用 Node.js 流處理數(shù)據(jù)使 Node 開發(fā)人員能夠順暢地處理傳入和傳出的數(shù)據(jù)。企業(yè)家可以使用流從他們的 Node 應(yīng)用程序中更好地管理、運(yùn)行和利用出色的Node js 性能,尤其是通過更好的內(nèi)存管理。
(言鼎科技)