Express和Mongodb多次插入相同的数据

时间:2016-09-10 16:28:19

标签: javascript node.js mongodb express

我对Express和Mongodb很新。我正在进行的项目要求我:

  1. 获取包含多个网址的对象
  2. 下载网址的内容并将其保存到云端存储
  3. 为每个保存的文件生成链接
  4. 将这些链接保存为Mongodb作为单独的文档
  5. 传入的对象看起来像这样:

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

    最终目标是在mongodb上保存3个单独的文件:

    {
        "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,则某些新文档将无法保存。

    非常感谢

1 个答案:

答案 0 :(得分:0)

在for循环中分配pragma(msg, __traits(compiles, { enum tmp = __traits(getMember, C, "foo"); })); // -> false pragma(msg, __traits(compiles, { enum tmp = __traits(getMember, C.init, "foo"); })); // -> false pragma(msg, __traits(compiles, { enum tmp = __traits(getMember, C, "bar"); })); // -> false pragma(msg, __traits(compiles, { enum tmp = __traits(getMember, C.init, "bar"); })); // -> false 时,这是一个范围问题。见这里:JavaScript closure inside loops – simple practical example

解决方案是使用new_url本身解决范围问题,因为每次迭代都会为回调创建一个闭包

Array.Prototype.forEach