ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js_node.js での Stream API の使用の簡単な分析
この記事では、node.js ストリーム API を浅いものから深いものまで紹介します。具体的な詳細については、以下を参照してください。
基本的な紹介
Node.js では、ファイルを読み取る方法が 2 つあります。1 つは fs.readFile を使用する方法、もう 1 つは fs.createReadStream を使用して読み取る方法です。
fs.readFile は、すべての Node.js ユーザーにとって最も馴染みのあるもので、理解しやすく、使いやすいです。ただし、大きなファイルに遭遇すると、すべてのデータが最初にメモリに読み込まれるため、この方法での読み取り効率が非常に低いという欠点があります。
fs.createReadStream は Stream を通じてデータを読み取り、ファイル (データ) を小さな部分に分割し、特定のイベントをリッスンして特定の処理関数を作成します。この方法は上記の方法に比べて簡単ではありませんが、非常に効率的です。
実際、Stream は Node.js でのファイル処理に使用されるだけでなく、process.stdin/stdout、http、tcp ソケット、zlib、crypto などの他の場所でも見ることができます。
この記事は、Node.js の Stream API について学習した内容をまとめたものであり、皆様のお役に立てれば幸いです。
特徴
イベントベースのコミュニケーション
パイプを介してストリームを接続できます
タイプ
Readable Stream 読み取り可能なデータ ストリーム
Writeable Stream 書き込み可能なデータ ストリーム
デュプレックス ストリームは、同時に読み取りと書き込みができる双方向データ ストリームです
Transform Stream は、読み取りと書き込みが可能なデータ ストリームを変換し、データの変換 (処理) も可能です
イベント
読み取り可能なデータ ストリームのイベント
データ流出時の読み取り可能なトリガー
data 明示的に一時停止されていないデータ ストリームの場合、データ イベント リスニング関数を追加します。これにより、データ ストリームがストリーム ダイナミクスに切り替わり、できるだけ早くデータが外部に提供されます。
end はデータの読み取り時にトリガーされます。 writeableStream.end() と混同しないように注意してください。 writeableStream には終了イベントがなく、.end() メソッド
があるだけです。データ ソースが閉じられるとクローズがトリガーされます
データの読み取り中にエラーが発生したときにトリガーされるエラー
書き込み可能なデータ ストリームのイベント
drain writable.write(chunk) は false を返します。すべてのキャッシュが書き込まれた後、再度書き込めるようになるとトリガーされます。
finish が .end メソッドを呼び出すと、読み取り可能なデータ ストリームの end イベントと同様に、キャッシュされたデータがすべて解放された後にトリガーされ、書き込みプロセスの終了を示します
パイプがパイプターゲットとして使用されるときにトリガーされます
unpipe unpipe がターゲットの場合にトリガーされます
データの書き込み時にエラーが発生した場合にトリガーされるエラー
ステータス
読み取り可能なデータ ストリームには、ストリームの動的状態と一時停止状態の 2 つの状態があります。データ ストリームの状態を変更する方法は次のとおりです。
一時停止ステータス -> ストリーミング ステータスデータイベントのリスニング関数を追加します
再開メソッドの呼び出し
パイプメソッドを呼び出す
注: ストリーミング ダイナミクスに変換するときに、データ イベントのリスニング関数がなく、パイプ メソッドの宛先がない場合、データは失われます。
ストリーミングステータス -> 一時停止ステータス
パイプメソッドの宛先が存在しない場合、pauseメソッドが呼び出されます
パイプ メソッドの宛先がある場合は、すべてのデータ イベント リスニング関数を削除し、unpipe メソッドを呼び出してすべてのパイプ メソッドの宛先を削除します
注: データ イベントのリッスン機能を削除するだけでは、データ フローが自動的に「一時停止状態」になるわけではありません。さらに、パイプ メソッドの宛先がある場合に一時停止メソッドを呼び出しても、それらの宛先がデータ要求を発行した後、データ フローが常に一時停止されるとは限りません。
使用法
ファイルの読み取りと書き込み
var fs = require('fs'); // 新建可读数据流 var rs = fs.createReadStream('./test1.txt'); // 新建可写数据流 var ws = fs.createWriteStream('./test2.txt'); // 监听可读数据流结束事件 rs.on('end', function() { console.log('read text1.txt successfully!'); }); // 监听可写数据流结束事件 ws.on('finish', function() { console.log('write text2.txt successfully!'); }); // 把可读数据流转换成流动态,流进可写数据流中 rs.pipe(ws); 读取 CSV 文件,并上传数据(我在生产环境中写过) var fs = require('fs'); var es = require('event-stream'); var csv = require('csv'); var parser = csv.parse(); var transformer = csv.transform(function(record) { return record.join(','); }); var data = fs.createReadStream('./demo.csv'); data .pipe(parser) .pipe(transformer) // 处理前一个 stream 传递过来的数据 .pipe(es.map(function(data, callback) { upload(data, function(err) { callback(err); }); })) // 相当于监听前一个 stream 的 end 事件 .pipe(es.wait(function(err, body) { process.stdout.write('done!'); }));
その他の使用法
https://github.com/jeresig/node-stream-playground を参照して、サンプル Web サイトに入った後、ストリームの追加をクリックして結果を直接確認します。
よくある落とし穴
rs.pipe(ws) を使用してファイルを書き込むと、rs の内容が ws の後ろに追加されませんが、ws の元の内容が rs の内容で直接上書きされます終了/閉じられたストリームは再利用できないため、データ ストリームを再作成する必要があります
パイプ メソッドはターゲット データ ストリームを返します。たとえば、a.pipe(b) は b を返します。そのため、イベントをリッスンするときは、監視しているオブジェクトが正しいかどうかに注意してください
複数のデータ ストリームを監視する必要があり、パイプ メソッドを使用してデータ ストリームを直列に接続する場合は、次のように記述する必要があります:
データ
.on('end', function() { console.log('data end'); }) .pipe(a) .on('end', function() { console.log('a end'); }) .pipe(b) .on('end', function() { console.log('b end'); });
一般的に使用されるクラス ライブラリ
イベントストリームを使用すると関数型プログラミングのように感じられ、個人的には気に入っていますawesome-nodejs#streams 他のストリームライブラリを使ったことがないので、必要な場合はここを見てください
上記の内容は編集者が紹介したNode.jsでのStream APIの使い方です。