2016-07-24 22 views
1

私はRequest npmモジュールを使用して、APIからデータを抽出し、それをMongoデータベースのフィールドに挿入します。アフガニスタンは、データベースの最初の国であり、データが入力される唯一の文書です。他のすべての国はスキップされます。 次のコードコンソールでは、「開始」と「終了」を順番に記録し、国名を記録します。私はこれがjavascriptの非同期性の結果であることを知っていますが、このコードにどのような影響を与えるのかはわかりません。 べきではありませんコンソールログ:ここMongoDb forEach非同期コールバック

begin 
country 
end 
etc... 

コード:

MongoClient.connect(url, function(err, db) { 
    db.collection('countries').find().forEach(function(myDoc) { 
    console.log('beginning'); 
    var code = myDoc.country.iso2; 
    var options = { 
     url: 'https://api.tugroup.com/v1/travelsafe/countries/' + code, 
     headers: { 
     ['X-Auth-API-Key']: '*******', 
     ['Content-Type']: 'application/x-www-form-urlencoded' 
     } 
    } 
    var callback = function(error, response, body) { 
     console.log(myDoc.country.name); 
     if (!error && response.statusCode == 200) { 
     var info = JSON.parse(body); 
     db.collection('countries').updateOne(
      { 'country.name' : myDoc.country.name }, 
      { $set: { 
      'safety.hasAdvisoryWarning' : info.hasAdvisoryWarning, 
      'safety.hasRegionalAdvisory' : info.hasRegionalAdvisory, 
      'safety.advisories' : info.advisories, 
      'safety.advisoryState' : info.advisoryState, 
      'safety.advisoryText' : info.advisoryText, 
      'safety.lawAndCulture' : info.lawAndCulture, 
      'safety.security' : info.safety} 
     }, 
     function(err, result) { 
      console.log(err); 
      db.close(); 
     }); 
     } 
    } 
    request(options, callback); 
    console.log('end'); 
    }); 
}); 

コンソールログ:

begin 
end 
begin 
end 
etc... 
Algeria 
American Samoa 
Andorra 
etc... 

答えて

2

あなたが閉じるためだけに更新される最初のものがある問題updateOneというコールバックのデータベース接続(db.close)。最初の更新が完了した後、mongoDBへの次の接続が閉じられます。

あなたのログ出力が

beginning 
$country 
end 

ようにする必要がありますなら、あなたはあなたの要求のコールバックにログを移動したり、順番にあなたの要求を発行する必要があります。

関連する問題