0

我正在使用 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()));

似乎没有什么对我有用。无论我做什么,我仍然会得到 Buffer 结果。任何有关如何完成这项工作的帮助将不胜感激。

4

1 回答 1

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()));
});
于 2014-02-05T22:33:02.023 回答