web-dev-qa-db-fra.com

Obtenez le corps de réponse entier lorsque la réponse est fragmentée?

Je fais une requête HTTP et j'écoute les "données":

response.on("data", function (data) { ... })

Le problème est que la réponse est fragmentée de sorte que les "données" ne sont qu'un morceau du corps renvoyé.

Comment renvoyer tout le corps?

51
ajsie
request.on('response', function (response) {
  var body = '';
  response.on('data', function (chunk) {
    body += chunk;
  });
  response.on('end', function () {
    console.log('BODY: ' + body);
  });
});
request.end();
70
Pero P.

Plus sur https://groups.google.com/forum/?fromgroups=#!topic/nodejs/75gfvfg6xuc , Tane Piper fournit une bonne solution très similaire à celle de scriptfromscratch, mais pour le cas d'un JSON réponse:

  request.on('response',function(response){
     var data = [];
     response.on('data', function(chunk) {
       data.Push(chunk);
     });
     response.on('end', function() {
       var result = JSON.parse(data.join(''))
       return result
     });
   });`

Cela résout le problème soulevé par OP dans la section des commentaires de la réponse de scriptfromscratch.

25
Jim Danz

Je n'ai jamais travaillé avec la bibliothèque HTTP-Client, mais comme elle fonctionne exactement comme l'API du serveur, essayez quelque chose comme ceci:

var data = '';
response.on('data', function(chunk) {
  // append chunk to your data
  data += chunk;
});

response.on('end', function() {
  // work with your data var
});

Voir documentation node.js pour référence.

6
schaermu

Afin de prendre en charge le spectre complet des applications HTTP possibles, l'API HTTP de Node.js est de très bas niveau. Les données sont donc reçues morceau par morceau, pas comme un tout.
Il existe deux approches à ce problème:

1) Recueillir des données sur plusieurs événements "données" et annexer les résultats
ensemble avant d'imprimer la sortie. Utilisez l'événement "end" pour déterminer
lorsque le flux est terminé et que vous pouvez écrire la sortie.

var http = require('http') ;
http.get('some/url' , function (resp) {
    var respContent = '' ;
    resp.on('data' , function (data) {
        respContent += data.toString() ;//data is a buffer instance
    }) ;
    resp.on('end' ,  function() {
        console.log(respContent) ;
    }) ;
}).on('error' , console.error) ;

2) Utilisez un package tiers pour résumer les difficultés liées à
collecte d'un flux de données complet. Deux packages différents fournissent un
API utile pour résoudre ce problème (il y en a probablement plus!): bl (Buffer
List) et concat-stream; faites votre choix!

var http = require('http') ;
var bl = require('bl') ;

http.get('some/url', function (response) {
    response.pipe(bl(function (err, data) {
        if (err) {
            return console.error(err)
        }
        data = data.toString() ;
        console.log(data) ;
    })) 
}).on('error' , console.error) ;
5
Salar

La raison pour laquelle il est foiré est que vous devez appeler JSON.parse (data.toString ()). Les données sont un tampon, vous ne pouvez donc pas les analyser directement.

3
Martin

Si cela ne vous dérange pas d'utiliser la bibliothèque de requêtes

var request = require('request');
request('http://www.google.com', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Print the google web page.
  }
})
1
tim