Подтвердить что ты не робот

Получите весь орган ответа, когда ответ будет разбит?

Я делаю HTTP-запрос и слушаю "данные":

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

Проблема заключается в том, что ответ фрагментирован, поэтому "данные" - это всего лишь часть тела, отправленного назад.

Как мне вернуть все тело?

4b9b3361

Ответ 1

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

Ответ 2

В https://groups.google.com/forum/?fromgroups=#!topic/nodejs/75gfvfg6xuc Tane Piper предлагает хорошее решение, очень похожее на scriptfromscratch, но для случая ответа 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
     });
   });`

Это относится к проблеме, которую OP раскрывает в разделе комментариев ответа scriptfromscratch.

Ответ 3

Я никогда не работал с библиотекой HTTP-Client, но поскольку он работает так же, как API-интерфейс сервера, попробуйте что-то вроде этого:

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

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

Обратитесь к node.js docs для справки.

Ответ 4

Причина, по которой она перепуталась, заключается в том, что вам нужно вызвать JSON.parse(data.toString()). Данные - это буфер, поэтому вы не можете просто его разобрать.

Ответ 5

Чтобы поддерживать весь спектр возможных HTTP-приложений, HTTP-API Node.js очень низкоуровневый. Таким образом, данные получают кусок куском не в целом.
Существует два подхода к этой проблеме:

1) Собирайте данные по нескольким событиям "данных" и добавьте результаты
вместе перед печатью вывода. Используйте событие "end", чтобы определить когда поток закончен, и вы можете написать вывод.

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) Используйте сторонний пакет для абстрагирования трудностей, связанных с использованием собирая весь поток данных. Два разных пакета предоставляют полезный API для решения этой проблемы (вероятнее всего!): bl (Buffer
List) и concat-stream; выбирайте!

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

Ответ 6

Если вы не против использования библиотеки запросов

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