node.js stream

2823 ワード

streamタイプReadable,Writable,Duplex,Transform

Readable Stream


Readableはメッセージキューの生産者と見なすことができます.Readableには2つのモード,流れモード,および非流れモードがある.
フローモード
フローモードユーザはdataイベントをリスニングし、自分で一時停止と者回復を決定することができる.読み取りは、データがbufferに書き込まれるように、buffer値がhighWaterMarkより高い場合に停止します.source=>buffer=>customer、栗を挙げて、大きな水槽Aの水を別の水槽Bに導入します.私たちは水筒Aにパイプを接続し、パイプの反対側にバケツ(緩存池)を接続し、バケツの反対側には流出水管を接続し、Bに流れ、Bにはスイッチがあります.バケツがhighWaterMarkに達すると、水筒Aはバケツへの注水を一時停止する.
ノンフローモード
非フローモードではユーザはbufferのデータを自分で読み取る必要がある、読み取りサイズは自分で決定するのでpauseやresumeも不要であり、readableイベントがトリガーするとread(size)読み取りデータを自分で呼び出すことができる.readableイベントがトリガーする条件は、データがキャッシュプールに到達することであるため、消費者が適時に問題を起こさないように、消費者が自分で条件ロックをかける必要がある.

Writable Stream


原理はReadable Streamと類似しており,これ以上述べない.

pipe


Streamにはパイプ(pipeline)が付いているので、流れはパイプで接続できます.Readable StreamをWritable Streamに直接接続できます.
const readable = fs.createReadableStream('/tmp/input.txt');
const writable = fs.createWritableStream('/tmp/output.txt');

readable.pipe(writable);

Readable Streamは生産者、Writable Streamは消費者で、本末転倒でwritable.pipe(readable)と書くことはできません

にじゅうりゅう

  • Duplex
  • Transform

  • Duplex読み書きストリームは、Readable StreamとWritable Streamのタイプである1つのボディにバンドルされていますが、2つのストリームは互いに独立して相互に関連しておらず、2つのオブジェクトを1つのオブジェクトに継承することに相当します.
    Transformというストリームはとても役に立ち、時にはWritable Streamを手に入れて、すぐにWritable StreamをReadable Stream pipeに変換して別のパイプラインに行くことがあります(前述したように、Writable Streamは生産者としてはできません).
    Transformは実践する必要がある.prototype._transformメソッド
    const { Transform } = require('stream');
    
    class TransformStream extends Transform {
      constructor(options) {
        super(options);
      }
    
      _transform (data, encoding, callback) {
        callback(null, data);
      }
    }
    

    栗を挙げます:upyun dumpのピクチャーから下りて更にアップロードして、ダウンロードして得たのはWritableStreamで、アップロードして必要なのはReadableStreamです.transformを使用しない場合はgetFileの結果を保存し、readable streamを作成し、readable stream pipeを作成します.Transform streamを使うと簡単です.
    async function foo() {
        try {
            const transform = new TransformStream();
            //   await Transform   stream   writable   readable,   pipe  
            const pass = client.getFile(path, transform);
            //   await,   await upyun getFile  
            const pipe = transform.pipe(request({
                uri: someuri,
                method: 'post',
                headers: {
                  'Content-Type': 'image/jpeg'
                },
                encoding: null,
            });
            
            const through = await pass; // hanlde getFile promise   upyun node sdk  。
            if (!through) { //   getFile   upyun  
                return false;
            }
        
            const reponse = await pipe; // handle pipe request
        } catch(err) {
            console.log(err);        
        }
    }