2016-09-10 22 views
0

我對Express和Mongodb相當陌生。我的工作的項目要求我:Express和Mongodb多次插入相同的數據

  1. 以包含多個URL
  2. 下載URL的內容,並將其保存到雲存儲
  3. 生成鏈接爲每個文件的對象保存的
  4. 保存這些鏈接到MongoDB中作爲單獨的文件

傳入的對象看起來是這樣的:

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

的最終目標是有這樣3個獨立的文件保存在MongoDB中:

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

我有一個簡單的循環是這樣的:

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

    }); 
} 

和節電功能如下:

function save_new_url_to_mongodb (data, cb) { 
    getCollection(collection, function (err, collection) { 
    if (err) { 
     return cb(err); 
    } 

    collection.insert(data, {w: 1, ordered: false}, function (err, result) { 
     if (err) { 
     return cb(err); 
     } 

     var item = fromMongo(result.ops); 
     cb(null, item); 
    }); 
    }); 
} 

var download = function(original_url, new_url, callback){ 
    request.head(original_url, function(err, res, body){ 
    if(res === undefined){ 
     console.log(err); 
    } else { 

     var localUrlStream = request(original_url); 
     var file = bucket.file(new_url); 
     var remoteWriteStream = file.createWriteStream(); 
     var stream = localUrlStream.pipe(remoteWriteStream); 

     stream.on('error', function (err) { 
      next(err); 
     }); 

     stream.on('finish', function(){ 
      callback(new_url); 
     }); 
    } 
    }); 
}; 

下載部分很好,我在我的雲存儲中獲得3個不同的圖像文件。 console.log也給了我3個不同的新網址。

問題是新保存的mongodb文檔都具有相同的new_url。有時,如果原始數據中有更多的original_url,則某些新文檔將無法保存。

非常感謝

+0

還附上您的下載功能 –

+0

@Wasiq穆罕默德包括封閉和更新保存功能以及它更有意義。謝謝 – gdzla

回答

0

它在你在的new_url分配for循環範圍界定問題。在這裏看到:JavaScript closure inside loops – simple practical example

一個解決方案是使用Array.Prototype.forEach其固有的解決範圍的問題,因爲每個迭代產生回調

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