javascript - MongoDb forEach 异步回调

标签 javascript node.js mongodb asynchronous

我正在使用 Request npm 模块从 API 中提取数据并将其插入到我的 Mongo 数据库中的字段中。阿富汗是数据库中的第一个国家,是唯一填充数据的文档。其他所有国家都被跳过。 以下代码控制台依次记录“开始”和“结束”,然后记录国家/地区名称。我知道这是 javascript 异步特性的结果,但我不确定它如何影响这段代码。 控制台日志不应该:

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

最佳答案

只更新第一个的问题是因为你在updateOne的回调中关闭了数据库连接(db.close)所以第一次更新后是完成后,您与 mongoDB 的以下连接已关闭。

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

beginning  
$country  
end  

然后您必须将日志记录移动到请求的回调中或按顺序发出请求。

关于javascript - MongoDb forEach 异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38550717/

相关文章:

javascript - JavaScript/jQuery 是否总是拥有最新的元素或该元素的版本?

javascript - 传递 null 值时 Heroku 应用程序崩溃

MongoDB $query 运算符忽略索引?

linux - 无法连接到服务器 127.0.0.1 shell/mongo.js

javascript - 从views.py获取Django Python数据到template.html中的javascript对象

javascript - xmlhttpreqeust 在 post/get 中失败但在常规表单提交中没有

javascript - 在移动和非移动浏览器中使用 <a href ="tel:...">

javascript - Vue.js 可以使用 node-coap 库吗?

node.js - 如何在 ExpressJS 中处理 HTTP 升级?

node.js - Mongoose 返回重复结果