2011-02-22 10 views
46

estoy haciendo una petición HTTP y escucho de "datos":¿Obtienes todo el cuerpo de respuesta cuando la respuesta se fragmenta?

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

El problema es que la respuesta está fragmentada por lo que los "datos" es sólo una pieza del cuerpo enviado de vuelta.

¿Cómo devuelvo todo el cuerpo?

+4

¿Por qué nodejs devuelve la respuesta fragmentada? ¿Hay algún uso para eso? –

Respuesta

64
request.on('response', function (response) { 
    var body = ''; 
    response.on('data', function (chunk) { 
    body += chunk; 
    }); 
    response.on('end', function() { 
    console.log('BODY: ' + body); 
    }); 
}); 
request.end(); 
+0

Sí, lo intenté también, el problema es que el cuerpo tendrá un formato inválido ... el final está un poco desordenado, creo que es un espacio en blanco o una nueva línea que hace que JSON.parse no pueda analizarlo. – ajsie

+0

Si su cuerpo es un mensaje json, necesita analizar la cadena a JSON (por ejemplo, 'JSON.parse (cuerpo);') – schaermu

+1

Sí, ese es el problema. El cuerpo generado al concatenar todos los datos no está en formato json válido, por lo que JSON.parse() arroja un error :( – ajsie

5

nunca trabajaron con la biblioteca de cliente HTTP, pero ya que funciona igual que la API del servidor, intentar algo como esto:

Ver node.js docs para referencia.

20

Más en https://groups.google.com/forum/?fromgroups=#!topic/nodejs/75gfvfg6xuc, Tane Piper proporciona una buena solución muy similar a la de scriptfromscratch, pero para el caso de una respuesta JSON:

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

Esto se aborda la cuestión de que la OP se crió en la sección de comentarios de la respuesta de scriptfromscratch.

3

La razón por la que está mal es porque necesita llamar a JSON.parse (data.toString()). Los datos son un buffer así que no puedes analizarlos directamente.

1

Si no les importa usar la biblioteca pedir

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. 
    } 
}) 
3

Con el fin de apoyar a todo el espectro de posibles aplicaciones HTTP, HTTP API Node.js es de muy bajo nivel. Por lo tanto, los datos se reciben en bloque por fragmento no como un todo.
hay dos enfoques que puede tomar para este problema:

1) Recopilar datos a través de múltiples eventos de "datos" y anexar los resultados
juntos antes de imprimir la salida. Use el evento "end" para determinar
cuando finalice la secuencia y pueda escribir la salida.

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) utilizar un paquete de terceros para abstraer las dificultades que entraña la
recogiendo un flujo completo de datos. Dos paquetes diferentes proporcionan una API útil
para resolver este problema (¡es probable que haya más!): Bl (Buffer
List) y concat-stream; ¡elige tu opción!

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