我在客户端使用一种表单,用户可以上传任意数量的文件,然后使用axios将其全部发送出去。
在NodeJS中接收它,我正在使用Multer通过req.files
获取文件及其信息,像这样:
[ { fieldname: 'file1',
originalname: 'someimage.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: './uploads/',
filename: '71027041755f49366c132555066d5b89',
path: 'uploads\\71027041755f49366c132555066d5b89',
size: 69336 } ]
我们可以看到,它是一个数组,可以包含多个文件,这很不错,但这是我的问题。
我想使用Mongoose将这些文件的信息存储在MongoDB中,以便知道文件的调用方式,目标,大小等。
我在Mongoose中定义了一个架构,如下所示:
const someSchema = new Schema({
files: {
originalname: String,
filename: String,
mimetype: String,
size: String,
destination: String,
path: String
}
});
但这只会允许我存储一个文件信息。我之前也尝试过:
const someSchema = new Schema({
files: Array
});
但是这不起作用(TypeError: Cannot set property 'originalname' of undefined
)。我还尝试设置Object
,这也会出错(TypeError: Cannot read property '0' of undefined
)。
顺便说一句,我正在阅读“文件”:
for (let i = 0; i < req.files.length; i++) {
someschema.files[i].originalname = req.files[i].originalname;
someschema.files[i].filename = req.files[i].filename;
someschema.files[i].mimetype = req.files[i].mimetype;
someschema.files[i].size = req.files[i].size;
someschema.files[i].destination = req.files[i].destination;
someschema.files[i].path = req.files[i].path;
}
上面的每个req.files[i].XXX
都记录下来,一切都按其定义。
有没有办法制作一个可以接受多个“文件”的模式?
换句话说:如果可以的话,有没有一种方法可以创建一个模式来接受带有多个对象的数组?
谢谢。
编辑:我想出了files: [Object]
,但这也行不通(TypeError)。
答案 0 :(得分:1)
使用$addToSet
将另一个对象推入数组。
您可以使用$push
代替$addToSet
,但这将允许您插入重复的对象。
模式:
var UserSchema = new Schema({
files: [{
originalname: String,
filename: String,
mimetype: String,
size: String,
destination: String,
path: String
}]
});
要将另一个对象插入数组。
let obj = {
originalname: "11",
filename: "11",
mimetype: "11",
size: "11",
destination: "11",
path: "11"
}
User.update({
_id: mongoose.Types.ObjectId("5bd99f95f255307d51f32578")
}, {
$addToSet: { files: obj}
}).exec(function(err, updated){
console.log(updated);
})
您的someschema.files
的长度最小。例如,2
的迭代次数比使用i
索引的迭代次数更多。请尝试以下:
for (let i = 0; i < req.files.length; i++) {
let obj = {};
obj.originalname = req.files[i].originalname;
obj.filename = req.files[i].filename;
obj.mimetype = req.files[i].mimetype;
obj.size = req.files[i].size;
obj.destination = req.files[i].destination;
obj.path = req.files[i].path;
someschema.files.push(obj); // lastly push whole object.
}
答案 1 :(得分:0)
尝试将字段包装在[]
中const someSchema = new Schema({
files: [{
originalname: String,
filename: String,
mimetype: String,
size: String,
destination: String,
path: String
}]
});