Multer gridfs 存储将上传的文件引用到新集合
Multer gridfs storage referencing uploaded file to a new collection
使用 multer gridfs 存储上传的文件我想将它引用到新创建的集合(电影)。
我引用的上传文件的 fileID 与上传的文件不同,即使电影集没有保存到数据库中也是如此。
我引用的上传文件的文件ID与上传的文件不一样,即使电影集没有保存在数据库中
//movie schema
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const MovieSchema = new Schema({
description: {
type: String,
},
category: {
type: String,
},
token: {
type: String,
},
fileID: {
type: Schema.Types.ObjectId,
ref: "contents.files"
}
});
module.exports = movies = mongoose.model('movies', MovieSchema);
let gfs;
conn.once('open', () => {
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection('contents');
});
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
const filename = req.body.fileName + path.extname(file.originalname);
const Description = req.body.Description
const fileInfo = {
filename: filename,
bucketName: 'contents',
metadata: req.body,
}
resolve(fileInfo, Description);
});
}
});
const upload = multer({
storage
});
router.get('/', (req, res) => {
res.render('index');
console.log(req.body)
});
//** uploading file to the db */
router.post('/', upload.any(), (req, res) => {
const movie = new movies({
description: "test",
category: "test",
fileID: gfs.files.id
})
movie.save()
});
fileID 与上传的文件ID 不同,并且集合未保存在数据库中 fileID 与上传的文件ID 不同,集合未保存在数据库中 fileID 与上传的文件ID 不同,并且该集合也未保存在数据库中
它不起作用,因为你把它变得比它需要的更复杂。您文件中的引用是不必要的。您可以使用此代码完成相同的操作。
//movie schema
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const MovieSchema = new Schema({
description: {
type: String,
},
category: {
type: String,
},
token: {
type: String,
},
fileID: {
type: Schema.Types.ObjectId, // There is no need to create references here
}
});
module.exports = movies = mongoose.model('movies', MovieSchema);
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
// if you are using a separate collection to store data
// there is no need to save this information on the metadata
// because you'll probably never use it
const filename = req.body.fileName + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'contents'
}
resolve(fileInfo);
});
}
});
const upload = multer({
storage
});
router.get('/', (req, res) => {
res.render('index');
console.log(req.body)
});
//** uploading file to the db */
router.post('/', upload.any(), (req, res) => {
const movie = new movies({
description: req.body.Description,
category: req.body.Category,
// Grab the file id that was stored in the database by the storage engine as the reference to your file
fileID: req.file._id
})
movie.save()
});
你不应该使用 uploads.any()
。这将接受任何传入的文件。相反,您应该使用 array
, single
or fields,具体取决于您发送的文件数量和您用来发送它们的字段名称。
稍后要从数据库中读取该文件,您只需查询您的 Movies
集合,并且 fileId
字段有一个标识符,您可以将其传递给 [=17] 中的 GridfsBucket
=] 并将流式传输到响应,将使用该 ID 存储的文件返回给用户,或者用于您的应用程序具有的任何业务逻辑。
使用 multer gridfs 存储上传的文件我想将它引用到新创建的集合(电影)。 我引用的上传文件的 fileID 与上传的文件不同,即使电影集没有保存到数据库中也是如此。 我引用的上传文件的文件ID与上传的文件不一样,即使电影集没有保存在数据库中
//movie schema
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const MovieSchema = new Schema({
description: {
type: String,
},
category: {
type: String,
},
token: {
type: String,
},
fileID: {
type: Schema.Types.ObjectId,
ref: "contents.files"
}
});
module.exports = movies = mongoose.model('movies', MovieSchema);
let gfs;
conn.once('open', () => {
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection('contents');
});
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
const filename = req.body.fileName + path.extname(file.originalname);
const Description = req.body.Description
const fileInfo = {
filename: filename,
bucketName: 'contents',
metadata: req.body,
}
resolve(fileInfo, Description);
});
}
});
const upload = multer({
storage
});
router.get('/', (req, res) => {
res.render('index');
console.log(req.body)
});
//** uploading file to the db */
router.post('/', upload.any(), (req, res) => {
const movie = new movies({
description: "test",
category: "test",
fileID: gfs.files.id
})
movie.save()
});
fileID 与上传的文件ID 不同,并且集合未保存在数据库中 fileID 与上传的文件ID 不同,集合未保存在数据库中 fileID 与上传的文件ID 不同,并且该集合也未保存在数据库中
它不起作用,因为你把它变得比它需要的更复杂。您文件中的引用是不必要的。您可以使用此代码完成相同的操作。
//movie schema
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const MovieSchema = new Schema({
description: {
type: String,
},
category: {
type: String,
},
token: {
type: String,
},
fileID: {
type: Schema.Types.ObjectId, // There is no need to create references here
}
});
module.exports = movies = mongoose.model('movies', MovieSchema);
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
// if you are using a separate collection to store data
// there is no need to save this information on the metadata
// because you'll probably never use it
const filename = req.body.fileName + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'contents'
}
resolve(fileInfo);
});
}
});
const upload = multer({
storage
});
router.get('/', (req, res) => {
res.render('index');
console.log(req.body)
});
//** uploading file to the db */
router.post('/', upload.any(), (req, res) => {
const movie = new movies({
description: req.body.Description,
category: req.body.Category,
// Grab the file id that was stored in the database by the storage engine as the reference to your file
fileID: req.file._id
})
movie.save()
});
你不应该使用 uploads.any()
。这将接受任何传入的文件。相反,您应该使用 array
, single
or fields,具体取决于您发送的文件数量和您用来发送它们的字段名称。
稍后要从数据库中读取该文件,您只需查询您的 Movies
集合,并且 fileId
字段有一个标识符,您可以将其传递给 [=17] 中的 GridfsBucket
=] 并将流式传输到响应,将使用该 ID 存储的文件返回给用户,或者用于您的应用程序具有的任何业务逻辑。