web-dev-qa-db-ja.com

「データ」イベントを含めずに「終了」イベントを呼び出さないhttp要求からのNode.js応答

したがって、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);

(私の知る限りでは)応答セッションを閉じるためにデータイベントをリッスンする必要がないドキュメントで、これが発生する理由を知りたいと思います。

22
TheCodingArt

_'end'_は、すべてのデータが消費されたときにのみ呼び出されます。以下の参照を確認してください。

イベント:「終了」

このイベントは、データが提供されなくなると発生します。

データが完全に消費されない限り、終了イベントは発生しないことに注意してください。これは、フローモードに切り替えるか、最後に到達するまでread()を繰り返し呼び出すことで実行できます。

しかし、なぜ.on('data',..)を呼び出す必要があるのですか?答えは

データイベントリスナーをアタッチすると、ストリームがフローモードに切り替わり、データが利用可能になり次第ハンドラに渡されます。

したがって、基本的にdataリスナーを追加することにより、ストリームをフローモードに変更し、データの消費を開始します。

詳細については このリンク を確認してください。

33
fmodos