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

,那么你必须记录进入你的请求的回调或按顺序发出您的要求。