首頁 web前端 js教程 nodejs中stream和pipe的深度理解

nodejs中stream和pipe的深度理解

Aug 15, 2017 am 10:16 AM
javascript nodejs stream

本篇文章主要介紹了理解nodejs的stream和pipe機制的原理和實現,具有一定的參考價值,感興趣的小伙伴們可以參考一下

##前言

前幾天別人請教我關於pipe的問題,我發現我雖然用了nodejs很久,但是由於每次用的不多所以經常迴避stream的使用,導致一直不熟,現在重新學習整理一下相關知識。

透過nodeschool學習stream

nodeschool有一個stream-adventure教學教導stream的使用,很簡單

簡單stream進行pipe

首先,我們可以透過管道將輸入定位到輸出,輸入輸出可以是控制台或檔案流或http請求,例如


process.stdin.pipe(process.stdout)
process.stdin.pipe(fs.createWriteStream(path))
fs.createReadStream(path).pipe(process.stdin)
登入後複製

pipe中間進行處理

如果我們想要在管道中間進行處理,例如想將輸入的字串變成大寫寫到輸出裡,我們可以使用一些可以作為中間處理的框架,例如through2就很方便


var through2 = require('through2');
var stream = through2(write,end)
process.stdin
  .pipe(stream)
  .pipe(process.stdout);

function write(line,_,next){
  this.push(line.toString().toUpperCase())
  next();
})
function end(done){
  done();
})
登入後複製

#stream轉換成普通回調

當我們輸入是流,而輸出是普通函數,我們需要把輸入流轉換成普通的buffer,這時可以試試concat-stream函式庫


#

var concat = require('concat-stream');

var reverseStream=concat(function(text){
  console.log(text.toString().split("").reverse().join(""));
})

process.stdin.pipe(reverseStream)
登入後複製

##http server中的流



類似stdin和fs,http由於其特性也適合使用流,所以其自帶類似特性


#
var http = require('http');
var server = http.createServer(function(req,res){
  req.pipe(res);
})
登入後複製

既作為輸入也作為輸出的流

request框架實作瞭如下功能,將一個串流pipe到request請求中,然後將流的內容髮送給伺服器,然後傳回作為流供其他程式碼使用,實作如下


var request = require('request');
var r = request.post('http://localhost:8099');
process.stdin.pipe(r).pipe(process.stdout)
登入後複製

分支管道

下邊是一個例子,這個例子將輸入管道中html包含loud class的元素放入另一個管道進行大寫操作,然後最後合併成輸出

  • var trumpet = require('trumpet');
    var through2 = require('through2');
    var fs = require('fs');
    var tr = trumpet();
    var stream = tr.select('.loud').createStream();
    var upper = through2(function(buf,_,next){
      this.push(buf.toString().toUpperCase());
      next();
    })
    stream.pipe(upper).pipe(stream);
    process.stdin.pipe(tr).pipe(process.stdout);
    登入後複製

  • 合併輸入輸出stream範例
  • 合併後的輸入輸出可像前文request一樣使用,下邊這個例子實作了使用流的方式進行子程序呼叫
  • var spawn = require('child_process').spawn;
    var duplexer2 = require('duplexer2');
    
    module.exports = function(cmd, args){
      var c = spawn(cmd,args)
      return duplexer2(c.stdin,c.stdout)
    }
    登入後複製

  • 總結

    ##透過上邊的例子,可以知道stream應該還有如何合併等更複雜的應用方式。總之整體上符合以下特性:
  • Stream分為readable、writeble
  • ######Stream透過pipe方法控制流向##################################################### #####httpServer和httpClient和file system和process.stdin\out\err通常可以作為stream############Stream可以被on(event)轉換為普通的變量,普通變量可以被write轉換成stream############Stream本身可以被拆分、合併、過濾#########

    以上是nodejs中stream和pipe的深度理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs專案怎麼部署到伺服器 nodejs專案怎麼部署到伺服器 Apr 21, 2024 am 04:40 AM

Node.js 專案的伺服器部署步驟:準備部署環境:取得伺服器存取權限、安裝 Node.js、設定 Git 儲存庫。建置應用程式:使用 npm run build 產生可部署程式碼和相依性。上傳程式碼到伺服器:透過 Git 或檔案傳輸協定。安裝依賴項:SSH 登入伺服器並使用 npm install 安裝應用程式相依性。啟動應用程式:使用 node index.js 等命令啟動應用程序,或使用 pm2 等進程管理器。設定反向代理(可選):使用 Nginx 或 Apache 等反向代理路由流量到應用程式

nodejs和java選哪個 nodejs和java選哪個 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。

See all articles