node.jsのstreamを勉強します.
2757 ワード
node.jsは各種ウェブサーバを開発するための開発ツールで、node.jsサーバでは、高性能V 8 JavaScriptスクリプト言語を実行しています.言語はサーバー側で実行できるJavaScriptスクリプト言語です.
node.jsはシングルスレッドで、非閉塞の非同期I/O機構を採用しています.nodeのI/Oは非同期ですので、ディスクとネットワークに対する読み書きはコールバック関数でデータを読み取る必要があります.通常は、サービスがファイルデータを送信する前に、ファイルデータをメモリ全体にキャッシュする必要がありますが、転送するリソースが大きいと同時に量が大きいと、運行効率が低下します.node.jsの中のはデータがまだ完全に用意されていない時から非同期でデータを処理することができます.ファーストフードの店で食事をするように、一人一人がお金を払ってから食事を取り始めたら、後の人は待つしかないです.しかし、番号を呼ぶ方式を採用すれば、一人が一つの番号を受け取ってしまうので、待つということにはなりません.node.jsの非同期I/Oメカニズムはこのような方式を実現しました.node.jsでは、1つの時点で1つのイベントコールバック関数しか実行できませんが、1つのイベントコールバック関数を実行する途中で、他のイベント(新しいイベントのトリガ、イベントのコールバック関数などを含む)を処理して、元のイベントコールバック関数を実行し続けることができます.
本題に戻ります.流れの最大の特徴は、完全に現れていない時にすでに出ている部分を使うことです.このストリームは、node.jsのIOに似ています.つまり、node.jsはデータが完全に現れていない場合に、非同期処理データを開始することができます.
具体的な例を見てみましょう.
実現コードは以下の通りです.
私たちは、streamが連続的なデータストリームとして動作し、データが流出する時にこれらのデータを操作できることを知っています.node.jsでは、一定量のデータを受信するたびにdataイベントがトリガされ、streamがファイルの最後に到達するとendイベントがトリガされる.
node.jsはシングルスレッドで、非閉塞の非同期I/O機構を採用しています.nodeのI/Oは非同期ですので、ディスクとネットワークに対する読み書きはコールバック関数でデータを読み取る必要があります.通常は、サービスがファイルデータを送信する前に、ファイルデータをメモリ全体にキャッシュする必要がありますが、転送するリソースが大きいと同時に量が大きいと、運行効率が低下します.node.jsの中のはデータがまだ完全に用意されていない時から非同期でデータを処理することができます.ファーストフードの店で食事をするように、一人一人がお金を払ってから食事を取り始めたら、後の人は待つしかないです.しかし、番号を呼ぶ方式を採用すれば、一人が一つの番号を受け取ってしまうので、待つということにはなりません.node.jsの非同期I/Oメカニズムはこのような方式を実現しました.node.jsでは、1つの時点で1つのイベントコールバック関数しか実行できませんが、1つのイベントコールバック関数を実行する途中で、他のイベント(新しいイベントのトリガ、イベントのコールバック関数などを含む)を処理して、元のイベントコールバック関数を実行し続けることができます.
本題に戻ります.流れの最大の特徴は、完全に現れていない時にすでに出ている部分を使うことです.このストリームは、node.jsのIOに似ています.つまり、node.jsはデータが完全に現れていない場合に、非同期処理データを開始することができます.
具体的な例を見てみましょう.
var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res) {
fs.readFile(__dirname + '/text.txt',function(err,data) {
res.end(data);
});
});
server.listen(3000);
この例は簡単で、このコードには何の問題もないようです.しかし、このコードは潜在的な問題を含んでいます.つまり、nodeはtext.txtファイル全体をメモリにキャッシュして、クライアントの要求に応答します.クライアントの要求が増加するにつれて、メモリの消費は非常に大きくなり、クライアントは長い時間を待って結果を得ることができます.しかし、もし私達はnodeにtext.txtファイルの一定量を読み取らせることを採用するならば、サービスキャッシュとクライアントの待ち時間を必要としないで、応答内容をクライアントに送信し始めます.実現コードは以下の通りです.
var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res) {
var stream = fs.createReadStream(__dirname + '/text.txt');
stream.pipe(res);
});
server.listen(3000);
この中で、上記の変化に対して最も大きなものは、サービスバッファやクライアントの待ち時間なしに、createReadStreamというfs方式を用いてstream変数を作成し、この変数のpipe方法によってクライアントの要求に応答して、nodeにファイルを一定量読み込ませると、クライアントに応答内容を送信することである.私たちは、streamが連続的なデータストリームとして動作し、データが流出する時にこれらのデータを操作できることを知っています.node.jsでは、一定量のデータを受信するたびにdataイベントがトリガされ、streamがファイルの最後に到達するとendイベントがトリガされる.
<span style="font-size:14px;">options = {
host: 'localhost',
port: 4000,
path: path,
method: 'GET',
headers: headers
};
internalReq = http.request(options, function (newRes) {
newRes.setEncoding('utf-8');
var responseString = '';
newRes.on('data', function (data) {
responseString += data;
});
newRes.on('end', function () {
try {
var resultObject = JSON.parse(responseString);
//console.log(resultObject);
next(resultObject);
//res.send(resultObject);
}catch (e){
//res.send('error');
}
});
});</span>