2016-07-24 168 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

,只有第一個更新是因爲你關閉問題數據庫連接(db.close)在updateOne的回調中,以便在完成第一次更新後,關閉以下與mongoDB的連接。

如果你的日誌輸出應該像

beginning 
$country 
end 

,那麼你必須記錄進入你的請求的回調或按順序發出您的要求。