2016-09-10 4 views
0

Ich bin ziemlich neu in Express und Mongodb. Das Projekt, das ich an bearbeite erfordert mich:Express und Mongodb dieselben Daten mehrmals einfügen

  1. ein Objekt nehmen, die mehrere url
  2. Laden Sie den Inhalt der URL und speichern Sie sie in einem Cloud-Speicher enthält
  3. Links zu erzeugen, um die Datei für jede gespeicherten
  4. diese Links in MongoDB als einzelne Dokumente speichern

Das ankommende Objekt etwas wie folgt aussieht:

{ 
    "id" : 12345678, 
    "attachments" : [ 
     { 
      "original_url" : "https://example.com/1.png", 
     }, 
     { 
      "original_url" : "https://example.com/2.png", 
     }, 
     { 
      "original_url" : "https://example.com/3.png", 
     } 
    ] 
} 

das Endziel ist 3 separate Dokument wie diese auf mongodb gespeichert haben:

{ 
    "id" : 87654321, 
    "some_other_data": "etc", 
    "new_url" : "https://mycloudstorage.com/name_1.png" 
} 

Ich habe eine einfache Schleife wie folgt aus:

for(var i = 0; i < original_data.attachments.length; i++){ 

    var new_url = "https://example.com/" + i + ".png"; 

    download(original_url, new_url, function(new_url){ 

     console.log(new_url) 

     new_data.new_url = new_url; 

     save_new_url_to_mongodb(new_data); 

    }); 
} 

und die Sparfunktion wie folgt aussieht:

Der Download-Teil ist in Ordnung, ich bekomme 3 verschiedene Bilddateien in meinem Cloud-Speicher. Das console.log gibt mir auch 3 verschiedene neue URLs.

Das Problem ist, dass das neu gespeicherte mongodb Dokument alle die gleiche new_url haben. Und manchmal, wenn mehr original_url in den Originaldaten vorhanden ist, können einige der neuen Dokumente nicht gespeichert werden.

Vielen Dank

+0

legt auch Ihre Download-Funktion –

+0

@Wasiq Muhammad enthielt und die Speicher-Funktion aktualisiert außerdem, damit es mehr Sinn macht. Danke – gdzla

Antwort

0

Es ist eine Scoping-Ausgabe in Ihrer Zuordnung von new_url in der for-Schleife. Siehe hier: JavaScript closure inside loops – simple practical example

Eine Lösung zu verwenden Array.Prototype.forEach ist, die von Natur aus dem Umfang Problem löst, da jede Iteration einen Verschluss für den Rückruf schafft

original_data.attachments.forEach(function(i) { 
    var new_url = "https://example.com/" + i + ".png"; 

    download(original_url, new_url, function(new_url){ 
    console.log(new_url) 
    new_data.new_url = new_url; 
    save_new_url_to_mongodb(new_data); 
    }); 
})