Node.jsストリーム

ストリームの目的、ストリームが非常に重要である理由、およびストリームの使用方法を学びます。

ストリームとは

ストリームは、Node.jsアプリケーションを強化する基本的な概念の1つです。

これらは、ファイルの読み取り/書き込み、ネットワーク通信、またはあらゆる種類のエンドツーエンドの情報交換を効率的な方法で処理する方法です。

ストリームはNode.jsに固有の概念ではありません。それらは数十年前にUnixオペレーティングシステムで導入され、プログラムはパイプ演算子を介してストリームを介して相互に対話できます(|)。

たとえば、従来の方法では、プログラムにファイルを読み取るように指示すると、ファイルは最初から最後までメモリに読み込まれ、その後処理されます。

ストリームを使用して、1つずつ読み取り、すべてをメモリに保持せずにコンテンツを処理します。

Node.jsstreamモジュールすべてのストリーミングAPIを構築するための基盤を提供します。

ストリームする理由

ストリームは基本的に、他のデータ処理方法を使用して2つの大きな利点を提供します。

  • メモリ効率:処理する前に、メモリに大量のデータをロードする必要はありません
  • 時間効率:データペイロード全体が開始できるようになるまで待つのではなく、データを取得したらすぐに処理を開始するのにかかる時間が大幅に短縮されます

ストリームの例

典型的な例は、ディスクからファイルを読み取るものです。

ノードの使用fsモジュールを使用すると、ファイルを読み取り、httpサーバーへの新しい接続が確立されたときにHTTP経由で提供できます。

const http = require('http')
const fs = require('fs')

const server = http.createServer(function (req, res) { fs.readFile(__dirname + ‘/data.txt’, (err, data) => { res.end(data) }) }) server.listen(3000)

readFile()ファイルの内容全体を読み取り、完了するとコールバック関数を呼び出します。

res.end(data)コールバックでは、ファイルの内容をHTTPクライアントに返します。

ファイルが大きい場合、操作にかなりの時間がかかります。これは、ストリームを使用して記述されたものと同じものです。

const http = require('http')
const fs = require('fs')

const server = http.createServer((req, res) => { const stream = fs.createReadStream(__dirname + ‘/data.txt’) stream.pipe(res) }) server.listen(3000)

ファイルが完全に読み取られるまで待つのではなく、データのチャンクを送信する準備ができたらすぐにHTTPクライアントへのストリーミングを開始します。

パイプ()

上記の例では、次の行を使用していますstream.pipe(res)pipe()メソッドはファイルストリームで呼び出されます。

このコードは何をしますか?ソースを取得し、宛先にパイプします。

ソースストリームで呼び出すため、この場合、ファイルストリームはHTTP応答にパイプされます。

の戻り値pipe()メソッドは宛先ストリームです。これは、複数のチェーンを作成できる非常に便利なものです。pipe()このような呼び出し:

src.pipe(dest1).pipe(dest2)

この構成は、実行するのと同じです。

src.pipe(dest1)
dest1.pipe(dest2)

ストリームを利用したノードAPI

それらの利点により、多くのNode.jsコアモジュールはネイティブストリーム処理機能を提供します。

  • process.stdinstdinに接続されたストリームを返します
  • process.stdoutstdoutに接続されたストリームを返します
  • process.stderrstderrに接続されたストリームを返します
  • fs.createReadStream()ファイルへの読み取り可能なストリームを作成します
  • fs.createWriteStream()ファイルへの書き込み可能なストリームを作成します
  • net.connect()ストリームベースの接続を開始します
  • http.request()書き込み可能なストリームであるhttp.ClientRequestクラスのインスタンスを返します
  • zlib.createGzip()gzip(圧縮アルゴリズム)を使用してデータをストリームに圧縮します
  • zlib.createGunzip()gzipストリームを解凍します。
  • zlib.createDeflate()deflate(圧縮アルゴリズム)を使用してデータをストリームに圧縮します
  • zlib.createInflate()deflateストリームを解凍します

さまざまな種類のストリーム

ストリームには4つのクラスがあります。

  • Readable:パイプを使用できるが、パイプを使用できないストリーム(データを受信することはできますが、データを送信することはできません)。データを読み取り可能なストリームにプッシュすると、コンシューマーがデータの読み取りを開始するまで、データはバッファリングされます。
  • Writable:パイプすることはできるがパイプすることはできないストリーム(データを送信することはできますが、受信することはできません)
  • Duplex:パイプインとパイプの両方が可能なストリーム、基本的には読み取り可能ストリームと書き込み可能ストリームの組み合わせ
  • Transform:変換ストリームはデュプレックスに似ていますが、出力は入力の変換です

読み取り可能なストリームを作成する方法

から読み取り可能なストリームを取得しますstreamモジュール、そしてそれを初期化します

const Stream = require('stream')
const readableStream = new Stream.Readable()

ストリームが初期化されたので、データを送信できます。

readableStream.push('hi!')
readableStream.push('ho!')

書き込み可能なストリームを作成する方法

書き込み可能なストリームを作成するには、ベースを拡張しますWritableオブジェクトであり、その_write()メソッドを実装します。

まず、ストリームオブジェクトを作成します。

const Stream = require('stream')
const writableStream = new Stream.Writable()

その後、実装します_write

writableStream._write = (chunk, encoding, next) => {
    console.log(chunk.toString())
    next()
}

これで、読み取り可能なストリームを次の場所にパイプできます。

process.stdin.pipe(writableStream)

読み取り可能なストリームからデータを取得する方法

読み取り可能なストリームからデータを読み取るにはどうすればよいですか?書き込み可能なストリームの使用:

const Stream = require('stream')

const readableStream = new Stream.Readable() const writableStream = new Stream.Writable()

writableStream._write = (chunk, encoding, next) => { console.log(chunk.toString()) next() }

readableStream.pipe(writableStream)

readableStream.push(‘hi!’) readableStream.push(‘ho!’)

を使用して、読み取り可能なストリームを直接消費することもできます。readableイベント:

readableStream.on('readable', () => {
  console.log(readableStream.read())
})

書き込み可能なストリームにデータを送信する方法

ストリームの使用write()方法:

writableStream.write('hey!\n')

書き込みを終了した書き込み可能なストリームを通知する

使用end()方法:

const Stream = require('stream')

const readableStream = new Stream.Readable() const writableStream = new Stream.Writable()

writableStream._write = (chunk, encoding, next) => { console.log(chunk.toString()) next() }

readableStream.pipe(writableStream)

readableStream.push(‘hi!’) readableStream.push(‘ho!’)

writableStream.end()

私の無料ダウンロードNode.jsハンドブック


その他のノードチュートリアル: