从 GitHub API 得到不完整的回复

Getting incomplete response from 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

您在获取大量数据后正在使用 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);
});
});

https.get() 的响应对象的 data 事件可以被调用多次,但您将在第一次响应之后结束 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);
});