node.js stream
streamタイプReadable,Writable,Duplex,Transform
Readableはメッセージキューの生産者と見なすことができます.Readableには2つのモード,流れモード,および非流れモードがある.
フローモード
フローモードユーザはdataイベントをリスニングし、自分で一時停止と者回復を決定することができる.読み取りは、データがbufferに書き込まれるように、buffer値がhighWaterMarkより高い場合に停止します.source=>buffer=>customer、栗を挙げて、大きな水槽Aの水を別の水槽Bに導入します.私たちは水筒Aにパイプを接続し、パイプの反対側にバケツ(緩存池)を接続し、バケツの反対側には流出水管を接続し、Bに流れ、Bにはスイッチがあります.バケツがhighWaterMarkに達すると、水筒Aはバケツへの注水を一時停止する.
ノンフローモード
非フローモードではユーザはbufferのデータを自分で読み取る必要がある、読み取りサイズは自分で決定するのでpauseやresumeも不要であり、readableイベントがトリガーするとread(size)読み取りデータを自分で呼び出すことができる.readableイベントがトリガーする条件は、データがキャッシュプールに到達することであるため、消費者が適時に問題を起こさないように、消費者が自分で条件ロックをかける必要がある.
原理はReadable Streamと類似しており,これ以上述べない.
Streamにはパイプ(pipeline)が付いているので、流れはパイプで接続できます.Readable StreamをWritable Streamに直接接続できます.
Readable Streamは生産者、Writable Streamは消費者で、本末転倒で
Duplex Transform
Duplex読み書きストリームは、Readable StreamとWritable Streamのタイプである1つのボディにバンドルされていますが、2つのストリームは互いに独立して相互に関連しておらず、2つのオブジェクトを1つのオブジェクトに継承することに相当します.
Transformというストリームはとても役に立ち、時にはWritable Streamを手に入れて、すぐにWritable StreamをReadable Stream pipeに変換して別のパイプラインに行くことがあります(前述したように、Writable Streamは生産者としてはできません).
Transformは実践する必要がある.prototype._transformメソッド
栗を挙げます:upyun dumpのピクチャーから下りて更にアップロードして、ダウンロードして得たのはWritableStreamで、アップロードして必要なのはReadableStreamです.transformを使用しない場合はgetFileの結果を保存し、readable streamを作成し、readable stream pipeを作成します.Transform streamを使うと簡単です.
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読み書きストリームは、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);
}
}