2016-04-29 29 views
0

のXMLをJSONに解析するときにLodashを使用してhttps.getをループするノードでXMLをJSONに解析しようとしています。私はxml2jsを使用しています。私はLodashを配列の各番号にループし、対応するURLを使用してXMLをJSONに変換したいと考えています。以下のコードを使用すると、Non-whitespace before first tagエラーが発生します。私が間違っていることは何か考えていますか?Nodeで

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

正直なところ、LoDashのヘルパーは、愚かなものです。 forEachは、任意のArrayインスタンスのプロトタイプメソッドです。 1つの問題は、これらの機能ヘルパーが非同期フロー制御を処理するように設計されていないことです。

フロー制御を扱う方法が12種類ありますが、最も簡単なのはおそらく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); 
    } 
}); 

ここでの違いは、非同期のコールバックを持つ関数に配列をマップすることです。こうすることで、各リクエストからの応答を配列に集め、各リクエストが応答したときにコールバックを起動することができます。それらのうちの1つがエラーの場合、プロセスは停止し、エラーが記録された最終コールバックを起動します(または別の方法を処理するロジックを記述することもできます)。