2016-04-29 38 views
0

我试图在节点中将XML解析为JSON。我正在使用xml2js。我想将Lodash合并到数组中的每个数字中,并使用相应的url将XML转换为JSON。当我使用下面的代码时,出现Non-whitespace before first tag错误。任何想法我做错了什么?当在节点中将XML解析为JSON时,使用Lodash循环浏览https.get

const no = [78787878,78787879, 787878780]; 

_.forEach(no, https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/'+no+'/info.xml', function (res) { 
    res.on('data', function (chunk) { 
     response_data += chunk; 
    }); 
    res.on('end', function() { 
     parser.parseString(response_data, function (err, result) { 
      if (err) { 
       console.log('Got error: ' + err.message); 
      } else { 
       console.log(util.inspect(result, false, null)); 
      } 
     }); 
    }); 
    res.on('error', function (err) { 
     console.log('Got error: ' + err.message); 
    }); 
})); 

回答

0

老实说forEach LoDash的助手有点傻。 forEach是任何Array实例的原型方法。一个问题是这些功能帮助程序不是用来处理异步流量控制的。

虽然有十几种方法来处理流量控制,最简单的方法可能是使用caolan/async模块的map()方法。

你的代码看起来是这样的:

var no = [78787878,78787879, 787878780]; 

async.map(no, function(cb) { 
    https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/'+no+'/info.xml', function (res) { 
     var response_data = ''; 
     res.on('data', function (chunk) { 
      response_data += chunk; 
     }); 
     res.on('end', function() { 
      parser.parseString(response_data, function (err, result) { 
       if (err) { 
        cb(err); 
       } else { 
        cb(null, result); 
       } 
      }); 
     }); 
     res.on('error', cb); 
    }) 
}, function(err, results) { 
    if(err) { 
     console.log("Error occured: ", err); 
    } 
    else { 
     console.log("Results(array): ", results); 
    } 
}); 

这里的区别是异步的阵列与一个回调函数映射。通过这种方式,您可以将每个请求的响应收集到数组中,并在每个请求响应时触发回调。如果其中一个出错,则进程停止并触发记录错误的最终回调(或者可以编写逻辑来处理另一种方式)。