2014-02-05 53 views
0

我正在使用Node.js脚本从StackOverflow收集数据。我知道所有的回应都是gzip,所以我把代码放在那个应该照顾的地方。我的脚本如下:StackOverflow API不返回JSON

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

一切似乎是为我工作。无论我做什么,我仍然得到Buffer结果。任何帮助如何使这项工作将不胜感激。

+2

如果你使用'的问题是什么。的toString()'? – Joe

回答

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