我使用 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
}
**
请帮忙。
答案 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
解析所有这些文件以最终获得已解析的文件名数组,然后我可以简单地传递以创建新记录。