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