从GitHub API获得不完整的响应

时间:2015-06-14 17:18:44

标签: node.js github-api

我正在尝试学习nodejs并且有这个页面应该打印出有人在GitHub上的所有回购。现在,它会在消息中途随机停止,所以如果我尝试将其解析为JSON,它就会失败。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  var https = require('https');
  var options = {
    host: 'api.github.com',
    headers: {'user-agent': 'GitHubAPI'},
    path: '/users/vermiculus/repos'
  };
  var gitapi = https.get(options, function(git) {
    git.on("data", function(chunk) {
      //JSON.parse(chunk); //DEBUG Fails and dies.
      res.end(chunk);
    });
  });
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

编辑:这是一个示例回复。看看它是如何在字符串中间停止的。

[{"id":24659454,"name":"arara","full_name":"vermiculus/arara","owner":{"login":"vermiculus","id":2082195,"avatar_url":"https://avatars.githubusercontent.com/u/2082195?v=3","gravatar_id":"","url":"https://api.github.com/users/vermiculus","html_url":"https://github.c

2 个答案:

答案 0 :(得分:2)

data响应对象的https.get()事件可以被多次调用,但是您在第一个事件之后结束了HTTP服务器的响应。

您应该收集所有块并将它们组合在end处理程序中:

var gitapi = https.get(options, function(git) {
  var chunks = [];

  git.on("data", function(chunk) {
    chunks.push(chunk);
  });

  git.on("end", function() {
    var json = Buffer.concat(chunks);
    res.end(json);
  });
});

FWIW,如果GH API数据是JSON,那么将text/plain设置为内容类型并没有多大意义。

如果您只想代理GH回复,您也可以使用pipe()(基本上与上述相同,效率更高):

var gitapi = https.get(options, function(git) {
  git.pipe(res);
});

答案 1 :(得分:1)

获得大量数据后,您正在使用res.end。在解析之前,尝试将所有块连接成一个单独的字符串。

var gitapi = https.get(options, function(git) {
var body = '';
git.on("data", function(chunk) {
  body += chunk.toString('utf8');
});
git.on("end", function() {
   //var json = JSON.parse(body)
   res.end(body);
});
});