数据不是保存在内部数组中,而是存储在新记录中

时间:2017-09-03 07:22:16

标签: angularjs node.js mongodb mongoose


我使用 MEAN 堆栈和 Multer 模块上传图片。
我能够从角度检索图像,甚至可以将图像路径发布到Mongoose集合。

问题是我期待一系列图像,但在发布到mongoose时,它将每个图像存储为新记录。

图片架构

var imageSchema=new Schema({
    productId:{type: String,required: false},
    imagePaths: [{type: String, required: false}]
});



POST API

router.post('/upload', upload.any(), function(req , res){
  console.log('Executing Upload API..');
    console.log(req.body);
    console.log(req.files);
    var images = req.files;

req.files.forEach(function(file){
      var filename = (new Date()).valueOf() + '-' + file.originalname;
      fs.rename(file.path,'public/images/'+ filename, function(err){
       // if (err) throw err;
        //Save to mongoose

        var image = new Image({
          productId: 1007,
          imagePaths: filename
        });
        image.save(function(err, result){
          if(err) throw err;
            res.json(result);
        });
        console.log('FileName :' + filename);

      });
    });
});



收藏已保存
如果我发布了2张图片,它会按照下图所示进行存储,但我希望这两张图片能够存放在同一条记录中,即imagePaths:内。

**

{
        "_id" : ObjectId("59abab004783d90bccb4a723"),
        "productId" : "1007",
        "imagePaths" : [
                "1504422656691-Screenshot (4).png"
        ],
        "__v" : 0
}
{
        "_id" : ObjectId("59abab004783d90bccb4a724"),
        "productId" : "1007",
        "imagePaths" : [
                "1504422656691-Screenshot (3).png"
        ],
        "__v" : 0
}

**
请帮忙。

1 个答案:

答案 0 :(得分:0)

forEach中,您正在为new Image的每个文件创建新记录,而您应该做的是创建所有文件名的数组并创建一次记录。也许这段代码可以帮到你。

router.post('/upload', upload.any(), function(req , res){
  console.log('Executing Upload API..');
  console.log(req.body);
  console.log(req.files);
  var images = req.files;

  const filePromises = req.files.map(function(file){
    var filename = (new Date()).valueOf() + '-' + file.originalname;
    console.log('FileName :' + filename);

    return new Promise(function(resolve, reject) {

      fs.rename(file.path,'public/images/'+ filename, function(err) {
        if (err) return reject(err);
        return resolve(filename);
      });
    });

  });

  Promise.all(filePromises)
  .then( fileNames => {

    var image = new Image({
      productId: 1007,
      imagePaths: fileNames
    });

    image.save(function(err, result){
      if(err) throw err;
      res.json(result);
    });
  })

});

在这里我创建了包含文件名的promises数组,然后使用Promise.all解析所有这些文件以最终获得已解析的文件名数组,然后我可以简单地传递以创建新记录。