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?
request.on('response', function (response) {
var body = '';
response.on('data', function (chunk) {
body += chunk;
});
response.on('end', function () {
console.log('BODY: ' + body);
});
});
request.end();
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.
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.
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) ;
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.
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.
}
})