Загруженный файл с использованием хранилища multer gridfs, я хочу связать его с недавно созданной коллекцией (фильмами). Идентификатор файла, на который я ссылался для загруженного файла, не совпадает с идентификатором загруженного файла, даже если коллекция фильмов не сохраняется в базе данных. Идентификатор файла, на который я ссылался на загруженный файл, не совпадает с загруженным файлом, даже если коллекция фильмов не сохраняется в базе данных.
//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.info(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()
});Идентификатор файла отличается от идентификатора загруженного файла, а также коллекция не сохраняется в БД. Идентификатор файла отличается от идентификатора загруженного файла, а также коллекция не сохраняется в БД. Идентификатор файла отличается от идентификатора загруженного файла, а также коллекция не является сохранено в БД





Это не сработает, потому что вы усложняете это дело, чем должно быть. Ссылки в вашем файле не нужны. Вы можете сделать то же самое с помощью этого кода.
//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.info(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 или поля в зависимости от того, сколько файлов вы отправили, и имена полей, которые вы использовали для их отправки.
Чтобы прочитать этот файл из базы данных позже, вам нужно только запросить свою коллекцию Movies, а поле fileId имеет идентификатор, который вы можете передать в GridfsBucket в openDownloadStream, и передать этот поток в ответ, возвращающий пользователю файл, который был сохранен с этим id или использовать в любой бизнес-логике вашего приложения.
Я не обновляю коллекцию @devconcept
Проверьте документы мангуста. Я не уверен, откуда взялся new movies, поэтому я не могу вам помочь с этой частью кода.
Единственная проблема сейчас в том, что схема фильма не сохраняется в базе данных.