我有一个脚本,用于执行大量HTTP请求,然后存储检索到的数据:
var ParseXbrl = require('parse-xbrl')
var request = require('request');
var tickers = ['AAPL','F','TSLA','GOOG','MSFT'];
var json = "";
var XML = "";
var Data = [];
for(z in tickers){
request
.get('https://www.valuespreadsheet.com/iedgar/results.php?stock=' + tickers[z] + '&output=json')
.on('response', function(response) {
response.on('data', function(chunk){
json += chunk;
});
response.on('end',function(){
json = JSON.parse(json);
request
.get(json.filings[2].instanceUrl)
.on('response', function(response) {
response.on('data', function(chunk){
XML += chunk;
});
response.on('end',function() {
ParseXbrl.parseStr(XML).then(function(parsedDoc) {
console.log(parsedDoc);
var x = 0;
for(i in parsedDoc){
Data[tickers[z]][x]=parsedDoc[i];
x++
console.log(Data);
}
});
});
});
});
});
}
上面的脚本返回以下错误代码:
undefined:1
[object Object]{
^
SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at IncomingMessage.<anonymous> (Test.js:18:24)
at emitNone (events.js:110:20)
at IncomingMessage.emit (events.js:207:7)
at endReadableNT (_stream_readable.js:1047:12)
at _combinedTickCallback (internal/process/next_tick.js:102:11)
at process._tickCallback (internal/process/next_tick.js:161:9)
[Finished in 0.871s]
然而,当我更改数组tickers
时,它只包含一个值,例如tickers = ['AAPL']
代码有效(我使用的代码是无关紧要的)。
我做了一些测试,发现当我向代码添加console.log(z);
时,它会在尝试检索任何数据之前记录0
和1
。这导致我怀疑我的代码在执行for(z in tickers)
之前循环request
答案 0 :(得分:1)
您正在构建的JSON字符串在第一次请求后将无效。如果API返回一个对象,您将最终得到:
"{ response1: 'foo'}{ response2: 'bar}{ etc }"
哪个JSON.parse
会出错,因为它不是单个对象(并且JSON.parse
期望的是什么)。如果它是一个阵列你有类似的问题:
"[responseArray1][responseArray2]"
同样,这不会解析,因为JSON.parse
需要单个对象。 Brett的评论是正确的,您需要移动定义json
变量的位置:
.on('response', function(response) {
var json = "";
response.on('data', function(chunk){
json += chunk;
});
这样你就不会连接多个请求响应。
同样适用于XML = '';