Nodejs 学習メモ ストリーム module_node.js
1、分析を開始します
Stream は、Node 内の多くのオブジェクトによって実装される抽象インターフェイスです。たとえば、HTTP サーバーへのリクエストはストリームであり、stdout もストリームです。ストリームは読み取り可能、書き込み可能、またはその両方です。
Stream への最初の取り組みは Unix の初期に始まり、数十年にわたる実践により、Stream のアイデアがいくつかの巨大なシステムを簡単に開発できることが証明されました。
Unix では、Stream は「|」によって実装されます。ノードでは、組み込みストリームモジュールとして、多くのコアモジュールとサードパーティモジュールが使用されます。
Unix と同様に、ノード ストリームの主な操作も .pipe() であり、ユーザーはアンチプレッシャー メカニズムを使用して読み取りと書き込みのバランスを制御できます。
Stream は、再利用可能な統合インターフェイスを開発者に提供し、抽象的な Stream インターフェイスを通じてストリーム間の読み取りと書き込みのバランスを制御できます。
TCP 接続は読み取り可能なストリームと書き込み可能なストリームの両方ですが、HTTP 要求オブジェクトは読み取り可能なストリームであり、http 応答オブジェクトは書き込み可能なストリームです。
ストリーム送信プロセスは、他のエンコード方式を設定しない限り、デフォルトでバッファ形式で送信されます。次に例を示します。
var サーバー = http.createServer(function(req,res){
res.writeHeader(200, {'Content-Type': 'text/plain'}) ;
res.end("こんにちは、ビッグベア!") ;
}) ;
サーバー.listen(8888) ;
console.log("http サーバーはポート 8888 で実行されています...") ;
それを変更するだけです:
var サーバー = http.createServer(function(req,res){
res.writeHeader(200,{
'Content-Type' : 'text/plain;charset=utf-8' // charset=utf-8 を追加
}) ;
res.end("こんにちは、ビッグベア!") ;
}) ;
サーバー.listen(8888) ;
console.log("http サーバーはポート 8888 で実行されています ...") ;
ノードの I/O は非同期であるため、ディスクとネットワークへの読み取りと書き込みにはデータを読み取るためのコールバック関数が必要です。 以下はファイルのダウンロードの例です
。
上記のコード:
var fs = require('fs') ;
var server = http.createServer(function (req, res) {
fs.readFile(__dirname '/data.txt', function (err, data) {
res.end(data);
}) ;
}) ;
サーバー.listen(8888) ;
サイズが大きく、同時実行の量が多い場合、大量のメモリが浪費されます。ユーザーはファイル データを受け入れる前に、ファイル全体がメモリにキャッシュされるまで待つ必要があるため、結果は
になります。
ユーザーエクスペリエンスはかなり悪いです。幸いなことに、両方のパラメータ (req、res) は Stream なので、fs.readFile() の代わりに fs.createReadStream() を使用できます。以下のように:
var fs = require('fs') ;
var server = http.createServer(function (req, res) {
var stream = fs.createReadStream(__dirname '/data.txt') ;
Stream.pipe(res) ;
}) ;
サーバー.listen(8888) ;
.pipe() メソッドは fs.createReadStream() の 'data' および 'end' イベントをリッスンするため、「data.txt」ファイル全体をキャッシュする必要はありません
ファイルを使用すると、クライアント接続が完了した直後にデータ ブロックをクライアントに送信できます。 .pipe() を使用するもう 1 つの利点は、クライアントが
の場合に問題を解決できることです。
非常に長いエンドツーエンドの遅延によって引き起こされる読み取りと書き込みの不均衡の問題。
基本的なストリームには、読み取り可能、書き込み可能、変換、二重、および「クラシック」の 5 つがあります。 (具体的な使い方についてはAPIをご確認ください)
2.事例の紹介
処理する必要のあるデータを一度にメモリにロードできない場合、または読み取りと処理を同時に行う方が効率的である場合、データ ストリームを使用する必要があります。 NodeJS は、さまざまなストリームを通じてデータ ストリームに対する操作を提供します。
大きなファイルのコピー プログラムを例として、データ ソースの読み取り専用データ ストリームを作成できます。例は次のとおりです。
rs.on('データ', 関数 (チャンク) {
doSomething(chunk); // 自由に詳細を試してください
});
rs.on('end', function () {
cleanUp() ;
}) ;
rs.on('データ', 関数 (チャンク) {
rs.pause() ;
doSomething(chunk, function () {
rs.resume() ;
}) ;
}) ;
rs.on('end', function () {
cleanUp();
}) ;
さらに、次のように、データ ターゲットの書き込み専用データ ストリームを作成することもできます。
var ws = fs.createWriteStream(dst) ;
rs.on('データ', 関数 (チャンク) {
ws.write(chunk);
}) ;
rs.on('end', function () {
ws.end();
}) ;
var ws = fs.createWriteStream(dst) ;
rs.on('データ', 関数 (チャンク) {
If (ws.write(chunk) === false) {
rs.pause() ;
}
}) ;
rs.on('end', function () {
ws.end();
});
ws.on('ドレイン', function () {
rs.resume();
}) ;
ファイルをコピーするより完全なプロセスは次のとおりです:
var fs = require('fs'),
パス = require('パス'),
out = process.stdout;
var filePath = '/bb/bigbear.mkv';
var readStream = fs.createReadStream(filePath);
var writeStream = fs.createWriteStream('file.mkv');
var stat = fs.statSync(filePath);
var totalSize = stat.size;
var allowedLength = 0;
var lastSize = 0;
var startTime = Date.now();
readStream.on('data', function(chunk) {
渡された長さ = chunk.length;
if (writeStream.write(chunk) === false) {
readStream.pause();
}
});
readStream.on('end', function() {
writeStream.end();
});
writeStream.on('ドレイン', function() {
readStream.resume();
});
setTimeout(function show() {
var パーセント = Math.ceil((passedLength / totalSize) * 100);
var size = Math.ceil(passedLength / 1000000);
var diff = サイズ - lastSize;
lastSize = サイズ;
out.clearLine();
out.cursorTo(0);
out.write('すでに完了' サイズ 'MB, ' パーセント '%, 速度:' diff * 2 'MB/s');
if (passedLength setTimeout(show, 500);
} else {
var endTime = Date.now();
console.log();
console.log('共用時間:' (endTime - startTime) / 1000 '秒。');
}
}, 500);
上の日付コードを "copy.js" として保存することができます。私は setTimeout を追加して (または setInterval を直接使用して)、
500 ミリ秒ごとに完了を観察し、完了したサイズ、百分率、および圧縮速度を制御台に書き込み、圧縮が完了すると総所要時間を計算します。
三、总结一下
(1)、ストリームの概念を理解します。(2)、熟练は関連StreamのAPIを使用します
(3)、ブロックの制御に注意してください。例: サイズファイルの一部は、「チャンクデータ」の形式で分割処理を実行します。
(4)、パイプの使用
(5)、次の概念:TCP 接続は可読ストリームであり、また可写流でもありますが、Http 接続とは異なり、http 要求オブジェクトは可読ストリームであり、http 応答オブジェクトは可写流です

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Node.js はサーバー側の JavaScript ランタイムであり、Vue.js は対話型ユーザー インターフェイスを作成するためのクライアント側の JavaScript フレームワークです。 Node.js はバックエンド サービス API 開発やデータ処理などのサーバー側開発に使用され、Vue.js はシングルページ アプリケーションや応答性の高いユーザー インターフェイスなどのクライアント側開発に使用されます。

Node.js は、高いパフォーマンス、スケーラビリティ、クロスプラットフォーム サポート、豊富なエコシステム、開発の容易さなどの機能を備えているため、バックエンド フレームワークとして使用できます。

MySQL データベースに接続するには、次の手順に従う必要があります。 mysql2 ドライバーをインストールします。 mysql2.createConnection() を使用して、ホスト アドレス、ポート、ユーザー名、パスワード、データベース名を含む接続オブジェクトを作成します。 connection.query() を使用してクエリを実行します。最後に connection.end() を使用して接続を終了します。

Node.js インストール ディレクトリには、npm と npm.cmd という 2 つの npm 関連ファイルがあります。違いは次のとおりです。拡張子が異なります。npm は実行可能ファイルで、npm.cmd はコマンド ウィンドウのショートカットです。 Windows ユーザー: npm.cmd はコマンド プロンプトから使用できますが、npm はコマンド ラインからのみ実行できます。互換性: npm.cmd は Windows システムに固有ですが、npm はクロスプラットフォームで使用できます。使用上の推奨事項: Windows ユーザーは npm.cmd を使用し、他のオペレーティング システムは npm を使用します。

Node.js には次のグローバル変数が存在します。 グローバル オブジェクト: グローバル コア モジュール: プロセス、コンソール、require ランタイム環境変数: __dirname、__filename、__line、__column 定数: unknown、null、NaN、Infinity、-Infinity

Node.js と Java の主な違いは、設計と機能です。 イベント駆動型とスレッド駆動型: Node.js はイベント駆動型で、Java はスレッド駆動型です。シングルスレッドとマルチスレッド: Node.js はシングルスレッドのイベント ループを使用し、Java はマルチスレッド アーキテクチャを使用します。ランタイム環境: Node.js は V8 JavaScript エンジン上で実行され、Java は JVM 上で実行されます。構文: Node.js は JavaScript 構文を使用し、Java は Java 構文を使用します。目的: Node.js は I/O 集中型のタスクに適しており、Java は大規模なエンタープライズ アプリケーションに適しています。

はい、Node.js はバックエンド開発言語です。これは、サーバー側のビジネス ロジックの処理、データベース接続の管理、API の提供などのバックエンド開発に使用されます。

Node.js プロジェクトのサーバー デプロイメント手順: デプロイメント環境を準備します。サーバー アクセスの取得、Node.js のインストール、Git リポジトリのセットアップ。アプリケーションをビルドする: npm run build を使用して、デプロイ可能なコードと依存関係を生成します。コードをサーバーにアップロードします: Git またはファイル転送プロトコル経由。依存関係をインストールする: サーバーに SSH で接続し、npm install を使用してアプリケーションの依存関係をインストールします。アプリケーションを開始します。node Index.js などのコマンドを使用してアプリケーションを開始するか、pm2 などのプロセス マネージャーを使用します。リバース プロキシの構成 (オプション): Nginx や Apache などのリバース プロキシを使用して、トラフィックをアプリケーションにルーティングします。
