2016-07-24 4 views
1

Ich benutze das Request npm-Modul, um Daten aus einer API zu extrahieren und in Felder in meiner Mongo-Datenbank einzufügen. Afghanistan, das erste Land in der Datenbank, ist das einzige Dokument, das mit Daten gefüllt wird. Jedes andere Land wird übersprungen. Die folgende Code-Konsole protokolliert nacheinander den "Anfang" und das "Ende" und protokolliert anschließend den Ländernamen. Ich bekomme, dass dies das Ergebnis der asynchronen Natur von Javascript ist, aber ich bin mir nicht sicher, wie es diesen Code beeinflusst. sollte nicht das Konsolenprotokoll:MongoDb forJeden asynchronen Callback

begin 
country 
end 
etc... 

Hier ist der Code:

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'); 
    }); 
}); 

Die Konsolenprotokolle:

begin 
end 
begin 
end 
etc... 
Algeria 
American Samoa 
Andorra 
etc... 

Antwort

2

Das Problem, das nur die erste Aktualisierung ist, weil Sie schließen die Datenbankverbindung (db.close) im Callback von updateOne, damit nach dem ersten Update die folgende Verbindung zu mongoDB geschlossen wird.

Wenn Ihre Log-Ausgabe sein sollte wie

beginning 
$country 
end 

dann müssen Sie die Protokollierung in den Rückruf Ihrer Anfragen verschieben oder Ihre Anfragen sequentiell ausgeben.

Verwandte Themen