从 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);
});
我正在尝试学习 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);
});