web-dev-qa-db-fra.com

Réponse Node.js de la requête http n'appelant pas l'événement 'end' sans inclure l'événement 'data'

J'ai donc une application client simple communiquant avec une application côté serveur dans node.js. Côté client, j'ai le code suivant:

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
}

La partie étrange est, si je n'inclus pas l'événement "data" via:

    response.on('data', function (data) {
       console.log('did get data: ' + data);
    });

L'événement "fin" de la réponse n'est jamais déclenché.

Le code du serveur est le suivant:

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);

Je voudrais savoir pourquoi cela se produit lorsque la documentation (à ma connaissance) ne vous oblige pas à écouter l'événement de données afin de fermer une session de réponse.

22
TheCodingArt

Le 'end' N'est invoqué que lorsque toutes les données ont été consommées, vérifiez la référence ci-dessous:

Événement: "fin"

Cet événement se déclenche lorsqu'aucune donnée supplémentaire n'est fournie.

Notez que l'événement de fin ne se déclenchera que si les données sont entièrement consommées. Cela peut être fait en passant en mode fluide ou en appelant à plusieurs reprises read () jusqu'à la fin.

Mais pourquoi avez-vous besoin d'appeler la .on('data',..)? La réponse est

Si vous attachez un écouteur d'événements de données, il basculera le flux en mode fluide et les données seront transmises à votre gestionnaire dès qu'elles seront disponibles.

Donc, fondamentalement, en ajoutant l'écouteur data, il change le flux en mode fluide et commence à consommer les données.

Veuillez vérifier ce lien pour plus d'informations à ce sujet.

33
fmodos