MongoDb forEachasynchronouscallback

我正在使用Request npm模块从api提取数据并将其插入到Mongo数据库中的字段中。 阿富汗是数据库中的第一个国家,是唯一充满数据的文件。 其他国家都会被跳过。 下面的代码控制台顺序logging“开始”和“结束”,然后logging国家名称。 我得到这是JavaScript的asynchronous性质的结果,但我不知道它是如何影响此代码。 不应该在控制台日志:

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... 

       

网上收集的解决方案 "MongoDb forEachasynchronouscallback"

只有第一个更新的问题是因为您在updateOne的callback中closures了数据库连接( db.close ),以便在第一次更新完成之后,您关于mongoDB的以下连接被closures。

如果你的日志输出应该是这样的

 beginning $country end 

那么您必须将日志logging移入您的请求的callback中,或按顺序发出您的请求。