Я делаю HTTP-запрос и слушаю "данные":
response.on("data", function (data) { ... })
Проблема заключается в том, что ответ фрагментирован, поэтому "данные" - это всего лишь часть тела, отправленного назад.
Как мне вернуть все тело?
Я делаю HTTP-запрос и слушаю "данные":
response.on("data", function (data) { ... })
Проблема заключается в том, что ответ фрагментирован, поэтому "данные" - это всего лишь часть тела, отправленного назад.
Как мне вернуть все тело?
request.on('response', function (response) {
var body = '';
response.on('data', function (chunk) {
body += chunk;
});
response.on('end', function () {
console.log('BODY: ' + body);
});
});
request.end();
В 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.
Я никогда не работал с библиотекой 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 для справки.
Причина, по которой она перепуталась, заключается в том, что вам нужно вызвать JSON.parse(data.toString()). Данные - это буфер, поэтому вы не можете просто его разобрать.
Чтобы поддерживать весь спектр возможных 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) ;
Если вы не против использования библиотеки запросов
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.
}
})