Node.js Mongoose不断添加相同的单个元素而不是所有元素

时间:2013-06-17 22:35:33

标签: node.js mongodb mongoose

在我的下面的代码中,我在console.log上打印的值是正确的,但是当我搜索并将对象输入到db中时,db中的所有对象都包含相同的十六进制和图像路径但是id是不同的。我首先尝试使用findOne,但结果相同。我是MongoDb的新手,所以我假设它只是一些我做傻的事情。任何想法请按我的方式发送:)

exports.addImage = function(req,res){
var params = req.body;
var colors = params.color;
var passedImg = params.path;
var ndxobj;
for(var index in colors){
    ndxobj = colors[index];
    //Values here are the correct index and contain valid data
    console.log("col: ", ndxobj);


    var query = clrModel.find({hex: ndxobj.hex}, function(err,result){
        if(!err && result.length > 0){
            console.log(result);
        }else if(!err){
            //We have an empty db for the searched obj
            var locclr = new clrModel({
              hex:      ndxobj.hex      
            });

            locclr.img.push({path:passedImg, date:ndxobj.imagedate});
            locclr.save(function(error, data){
                if(error){
                    console.log("Error in addImage find call: ",error);
                    res.json(error);
                }
                else{
                    console.log("Saving: ",data);
                    res.json(data);
                }
            });
        }else {
            //Handle error
        }
    });
}

};

1 个答案:

答案 0 :(得分:1)

我认为您的路径完全相同,因为您将path设置为passedImage,并且passedImage未从每个索引更新,但是设置在代码的顶部样品。至于十六进制值是完全相同的,这似乎正在发生,因为回调正在关闭ndxobj,所以当它们被调用时,它们都看着相同的值。要做到这一点,你需要使用一个函数来创建你的回调,类似于下面的内容(希望我关闭所有的parens和amp括号......)。有关详细信息,请参阅this StackOverflow post

exports.addImage = function(req,res){
  var makeCallback=function(ndxobj){
    return function(err,result){
      if(!err && result.length > 0){
          console.log(result);
      }else if(!err){
          //We have an empty db for the searched obj
        var locclr = new clrModel({
          hex:      ndxobj.hex      
        });

        locclr.img.push({path:passedImg, date:ndxobj.imagedate});
        locclr.save(function(error, data){
          if(error){
            console.log("Error in addImage find call: ",error);
            res.json(error);
          }else{
            console.log("Saving: ",data);
            res.json(data);
          }
        });
      }else{
        //Handle error
      }
    };
  });
  var params = req.body;
  var colors = params.color;
  var passedImg = params.path;
  var ndxobj;
  for(var index in colors){
    ndxobj = colors[index];
    //Values here are the correct index and contain valid data
    console.log("col: ", ndxobj);


    var query = clrModel.find({hex: ndxobj.hex}, makeCallback(ndxobj.hex));
  }
};