我正在使用Node.js脚本从StackOverflow收集数据。我知道所有的响应都是gzip压缩的,所以我把代码放在那里应该照顾它。我的脚本如下:
var request = require('request');
var zlib = require('zlib');
function getStackOverflowResponse(url, callback){
request(url, {encoding: null}, function(err, response, body){
if(response.headers['content-encoding'] == 'gzip'){
zlib.gunzip(body, function(err, dezipped) {
callback(dezipped);
});
} else {
callback(body);
}
});
}
var url = "https://api.stackexchange.com/docs/questions#pagesize=2&order=desc&min=2014-01-04&max=2014-02-02&sort=activity&tagged=apigee&filter=default&site=stackoverflow&run=true";
getStackOverflowResponse(url, function(questions) {
console.log(questions);
});
我没有获得JSON输出,而是得到以下响应:
Buffer 0d 0a 0d 0a 0d 0a 0d 0a 3c 21 44 4f 43 54 59 50 45 20 48 54 4d 4c 3e 0d 0a 3c 68 74 6d 6c 20 6c 61 6e 67 3d 22 65 6e 22 3e 0d 0a 3c 68 65 61 64 3e 20 0d ...
响应包含在我删除的开始和结束尖括号中,以便它显示在此处。
而不是callback(dezipped);
我尝试了callback(JSON.parse(dezipped));
和callback(JSON.parse(dezipped.toString()));
似乎没有什么对我有用。无论我做什么,我仍然得到缓冲区结果。任何有关如何使这项工作的帮助将不胜感激。
答案 0 :(得分:3)
Joe的解决方案是正确的 - request
正在返回一个缓冲流;用toString()
转换它将解决问题。
但是,看起来您实际上并没有调用JSON端点(您正在调用HTML文档页面?)
试试这个:
var request = require('request');
var zlib = require('zlib');
function getStackOverflowResponse(url, callback) {
request(url, {
encoding: null
}, function (err, response, body) {
if (response.headers['content-encoding'] == 'gzip') {
zlib.gunzip(body, function (err, dezipped) {
callback(dezipped);
});
} else {
callback(body);
}
});
}
var url = "https://api.stackexchange.com/2.1/questions?pagesize=2&order=desc&min=2014-01-04&max=2014-02-02&sort=activity&tagged=apigee&filter=default&site=stackoverflow&run=true";
getStackOverflowResponse(url, function (questions) {
console.log(JSON.parse(questions.toString()));
});