ホームページ >ウェブフロントエンド >jsチュートリアル >Nodejs のストリームとパイプについての深い理解

Nodejs のストリームとパイプについての深い理解

巴扎黑
巴扎黑オリジナル
2017-08-15 10:16:141781ブラウズ

この記事は主に、nodejs のストリームとパイプの仕組みを理解するための原理と実装を紹介します。興味のある方は参考にしてください。

前書き

数日前、ある人が私にパイプの問題について質問しました。私は長い間、nodejs を使用してきましたが、毎回あまり使用しないため、ストリームの使用を避けていたことがわかり、今、再学習しています。関連する知識を整理します。

nodeschoolを通してストリームを学びましょう

nodeschoolにはストリームの使用法を教えるためのストリームアドベンチャーチュートリアルがあり、とても簡単です

パイプへの単純なストリーム

まず第一に、入力を出力に配置できますパイプラインを介した入力と出力は、コンソール、ファイル ストリーム、または


process.stdin.pipe(process.stdout)
process.stdin.pipe(fs.createWriteStream(path))
fs.createReadStream(path).pipe(process.stdin)

パイプの途中で処理

などの http リクエストにすることができます。パイプラインの途中で処理したい場合は、例えば、入力文字列を大文字に変更して出力に書き込みたい場合、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は変換されます通常のコールバックに変換します

入力がストリームで出力が通常の関数の場合、入力ストリームを通常の関数バッファーに変換する必要があります。この時点で concat-stream ライブラリを試すことができます


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

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

process.stdin.pipe(reverseStream)

http サーバーのストリーム

は stdin や fs と似ており、その特性上、http もストリームの使用に適しており、同様の機能を備えています


var http = require('http');
var server = http.createServer(function(req,res){
  req.pipe(res);
})

両方の入力として機能するストリーム。リクエスト フレームワークは次の関数を実装し、ストリームをリクエスト リクエストにパイプし、ストリームのコンテンツをサーバーに送信し、他のコードで使用できるようにストリームとして返します。実装は次のとおりです。

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


分岐パイプライン

この例は、入力パイプライン内のloudクラスを含むhtml要素を大文字操作のために別のパイプラインに配置し、最後にそれらを出力にマージします

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はreadableとwritebleに分かれています

Streamはパイプメソッド
  • httpServerとhttpClient、ファイルシステムとプロセスを通じてフローの方向を制御します。 stdinouterrは通常ストリームとして利用可能
  • Stream on(event)で通常の変数に変換可能、writeで通常の変数をストリームに変換可能
  • ストリーム自体は分割、結合、フィルタリング可能

以上がNodejs のストリームとパイプについての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。