したがって、node.jsのサーバー側アプリケーションと通信する単純なクライアントアプリケーションがあります。クライアント側には、次のコードがあります。
function send (name) {
http.request({
Host: '127.0.0.1',
port: 3000,
url: '/',
method: 'POST'
}, function (response) {
response.setEncoding('utf8');
response.on('data', function (data) {
console.log('did get data: ' + data);
});
response.on('end', function () {
console.log('\n \033[90m request complete!\033[39m');
process.stdout.write('\n your name: ');
});
response.on('error', function (error) {
console.log('\n Error received: ' + error);
});
}).end(query.stringify({ name: name})); //This posts the data to the request
}
奇妙な部分は、次の方法で「データ」イベントを含めない場合です。
response.on('data', function (data) {
console.log('did get data: ' + data);
});
応答の「終了」イベントが発生することはありません。
サーバーコードは次のとおりです。
var query = require('querystring');
require('http').createServer(function (request, response) {
var body = '';
request.on('data', function (data) {
body += data;
});
request.on('end', function () {
response.writeHead(200);
response.end('Done');
console.log('\n got name \033[90m' + query.parse(body).name + '\033[39m\n');
});
}).listen(3000);
(私の知る限りでは)応答セッションを閉じるためにデータイベントをリッスンする必要がないドキュメントで、これが発生する理由を知りたいと思います。
_'end'
_は、すべてのデータが消費されたときにのみ呼び出されます。以下の参照を確認してください。
イベント:「終了」
このイベントは、データが提供されなくなると発生します。
データが完全に消費されない限り、終了イベントは発生しないことに注意してください。これは、フローモードに切り替えるか、最後に到達するまでread()を繰り返し呼び出すことで実行できます。
しかし、なぜ.on('data',..)
を呼び出す必要があるのですか?答えは
データイベントリスナーをアタッチすると、ストリームがフローモードに切り替わり、データが利用可能になり次第ハンドラに渡されます。
したがって、基本的にdata
リスナーを追加することにより、ストリームをフローモードに変更し、データの消費を開始します。
詳細については このリンク を確認してください。