我需要在循环中创建http.get请求到google api |缓存服务。使用nodejs我尝试这样做
for(var i = 41923,postID=i; i <= 41925; i++) {
http.get(options, function(res) {
res.setEncoding('utf8');
res.on('data', function(data) {
responseBody += data;
}).on('end', function() {
if(getPostCacheUrl) {
var json = JSON.parse(responseBody);
json.items = json.items || [];
var cacheUrl = getPostCacheUrl(json);
parseCacheUrl(cacheUrl);
}
}).on('error', function(error) {
console.log('ERROR' + error.message);
});
});
}
但是我发现了错误:
undefined:1
: 200}{"response
^
SyntaxError: Unexpected token {
at Object.parse (native)
at IncomingMessage.<anonymous> (/Users/macbookpro/Sites/googlecache/title.js:30:41)
at IncomingMessage.emit (events.js:88:20)
at HTTPParser.onMessageComplete (http.js:137:23)
at Socket.ondata (http.js:1137:24)
at TCP.onread (net.js:354:27)
答案 0 :(得分:2)
首先,看起来你没有得到任何数据......在行
}).on('end', function() {
应该有一个处理程序从中获取响应并解析它,例如:
}).on('end', function(responseBody) {
添加console.log(responseBody)来检查它是否是一个对象,我不记得这里传递了什么。
我不会问为什么你需要从谷歌请求这么多数据(注意禁令或反垃圾邮件行动);)
我在这里看到的另一个问题可能是异步请求。请尝试以下,如果有帮助请告诉我。它会在发送下一个请求之前等待请求完成。我猜这就是问题所在。
function getSomething(i) {
// make sure that i is int
i = parseInt(i);
console.log('Getting something: ' + i);
// put the i somewhere if needed... not sure what you need...
// break if out of the scope
if (i < 41923 || i > 41925) return;
http.get(options, function(res) {
res.setEncoding('utf8');
res.on('data', function(data) {
responseBody += data;
}).on('end', function(responseBody) {
// Do console.log(responseBody) to check how the response looks, it is probably object - pass data from it to JSON.parse()
// Not sure what is this var getPostCacheUrl
if(getPostCacheUrl) {
var json = JSON.parse(responseBody);
json.items = json.items || [];
var cacheUrl = getPostCacheUrl(json);
parseCacheUrl(cacheUrl);
}
console.log('Getting something: success - triggering next get!');
getSomething(i + 1);
}).on('error', function(error) {
console.log('ERROR' + error.message);
// If you need to go on even if there is an error add below line
//getSomething(i + 1);
});
// I would suggest to check timeout even as well
});
}
getSomething(41923);
可以在此处检查示例http://jsfiddle.net/Pu3cr/2/,但由于显而易见的原因,它不起作用。我希望它能帮助你完成你的项目。
如果您还需要更多信息,请与我们联系。
最佳, 马立克