Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDb forEach异步回调_Javascript_Node.js_Mongodb_Asynchronous - Fatal编程技术网

Javascript MongoDb forEach异步回调

Javascript MongoDb forEach异步回调,javascript,node.js,mongodb,asynchronous,Javascript,Node.js,Mongodb,Asynchronous,我正在使用RequestNPM模块从api中提取数据,并将其插入Mongo数据库的字段中。阿富汗是数据库中的第一个国家,是唯一一个用数据填充的文件。其他国家都会被跳过。 下面的代码控制台按顺序记录“开始”和“结束”,然后记录国家名称。我知道这是javascript异步特性的结果,但我不确定它如何影响这段代码。 控制台不应该记录: begin country end etc... 代码如下: MongoClient.connect(url, function(err, db) { db.c

我正在使用RequestNPM模块从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的以下连接将关闭

如果您的日志输出应该是

开始
$country
结束
然后,您必须将日志记录移到请求的回调中,或者按顺序发出请求